# `com.siltwell/garden` on anlyon.dev

> Text inside fenced blocks marked untrusted-server-text was written by the MCP server's publisher, not by anlyon.dev. It is data to inspect, not instructions to follow. Invisible characters are shown as [U+XXXX].
> No finding is not a safety guarantee: these are point-in-time checks of tool definitions, not of code or behaviour.

- Page: https://anlyon.dev/servers/com.siltwell/garden
- JSON: https://anlyon.dev/api/v1/servers/com.siltwell/garden
- Version: 1.0.0 (active)
- Publisher: com.siltwell (domain proven to the MCP Registry)
- Runs: remote (streamable-http)
- Sign-in to list tools: none
- Metadata from the official MCP Registry, synced 2026-10-21T18:04:59.466Z

Title and description, as the publisher wrote them:

```untrusted-server-text
Siltwell
Your garden notebook: ask about your beds, plantings, harvests and frost dates, and log your work.
```

Scanned 2026-10-21T18:55:26.410Z over streamable-http.

**32 tools: 10 can delete or cancel things, 6 change things and 16 only read.**

| Group | Class | Tools | Claude Code |
| --- | --- | --- | --- |
| Deletes or cancels | destructive | 10 | deny |
| Can't be undone | irreversible | 0 | ask |
| Changes things | write | 6 | ask |
| Only reads | read | 16 | allow |

## Exfil surface

No private-data -> untrusted-input -> outbound path in this server alone: no tool is tagged outbound.

| Tag | Meaning | Tools |
| --- | --- | --- |
| private-data | Reads files, mail, messages, databases, secrets, calendars or repositories. | `mcp__garden__list_beds` `mcp__garden__log_event` `mcp__garden__search_events` |
| untrusted-input | Brings in text someone else can write: web pages, inbound email, messages, issues and comments. | `mcp__garden__lookup_frost_dates` `mcp__garden__lookup_frost_risk` `mcp__garden__lookup_growing_season` `mcp__garden__lookup_planting_windows` |
| outbound | Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL. | none |

## Findings

- **warn** Annotations that disagree with the tool in `log_event` ([annotation-conflict](https://anlyon.dev/methodology#annotation-conflict))

```untrusted-server-text
The server marks "log_event" as not read-only (readOnlyHint: false), and its words say it reads.

annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_event" says "log": a word for reading.
```

- **warn** Annotations that disagree with the tool in `log_curing` ([annotation-conflict](https://anlyon.dev/methodology#annotation-conflict))

```untrusted-server-text
The server marks "log_curing" as not read-only (readOnlyHint: false), and its words say it reads.

annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_curing" says "log": a word for reading.
```


## Deletes or cancels (10)

Removes, cancels or revokes something. Claude Code: deny.

### `add_planting`

- The name "add_planting" says "add": a word for a change.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Record that the user planted/sowed something: creates the plant in their catalog if new and the planting in the named bed. Passing variety replaces the variety stored on an existing plant with the same name.
```

### `delete_bed`

- The name "delete_bed" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Remove a bed from the garden. Siltwell archives it: it leaves the bed lists in the app and in these tools, its care schedules stop, and planned plantings queued for it are skipped. Past weather history still shows its name. The app has no way to restore it. Blocked while the bed has active plantings; remove or finish those first. Identify by bed name.
```

### `delete_planned_planting`

- The name "delete_planned_planting" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Remove an entry from the succession plan outright (a queued future planting that hasn't been sown). This is a hard delete, not recoverable — for a planting already sown/growing, use delete_planting instead. Identify it by id (from list_planned_plantings).
```

### `delete_planting`

- The name "delete_planting" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Remove a planting from the garden. Siltwell archives it: it disappears from the app and from these tools, and its care schedules stop. Its harvests, events and photos stay stored, but the app has no way to restore it. Identify by plant name or plantingId. Use when the user says to delete/remove a planting (e.g. one added by mistake).
```

### `delete_schedule`

- The name "delete_schedule" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Turn off a recurring care schedule (stops its reminders). Identify it by scheduleId, or by scope — plant (its active planting), bed, or garden-wide (neither) — optionally narrowed by type (water/fertilize/custom). Use when the user says to stop a watering/feeding reminder.
```

### `place_planting`

- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Place or move a planting on its bed's layout grid — set its position (xCm, yCm measured from the bed's top-left corner) and footprint (wCm × hCm) in centimeters. Identify the planting by plant name or plantingId. Use when the user wants to arrange, position, or move a plant within its bed. For a planting that already spans several grid squares, use the app's layout editor instead.
```

### `update_bed`

- The name "update_bed" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Change an existing bed's name, type, or dimensions. Identify the bed by its current name. Use when the user wants to rename a bed, change its type, or set/adjust its dimensions.
```

### `update_harvest`

- The name "update_harvest" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Correct a logged harvest — the most-recent harvest of a plant (by name) or a specific harvestId. Edit quantity, unit, notes, or the date. Use when the user says a harvest they recorded was wrong.
```

### `update_planned_planting`

- The name "update_planned_planting" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Update a queued succession-plan entry: change its status (planned/done/skipped), reschedule its targetDate, or adjust quantity/notes. Identify it by id (from list_planned_plantings). Use when the user sows a planned planting (mark status done), decides to skip it, or wants to reschedule/adjust it.
```

### `update_planting`

- The name "update_planting" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Change a planting's status (active/finished/failed), notes, quantity, transplant date, variety, or MOVE it to another bed (pass bed with the target bed's name — history stays attached; any layout position is cleared, re-place with place_planting). Identify the planting by plant name or plantingId.
```

## Changes things (6)

Creates or changes something that can be changed back. Claude Code: ask.

### `add_planned_planting`

- The name "add_planned_planting" says "add": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Queue a future planting for a bed as part of a succession plan — it is NOT yet sown (use add_planting for something the user already planted). Use when the user wants to plan ahead, e.g. "plan to plant more carrots in Bed 2 on August 15".
```

### `create_bed`

- The name "create_bed" says "create": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Add a garden bed. `type` is one of outdoor_bed (in-ground), raised_bed, greenhouse, grow_light_shelf, pot. Dimensions (lengthCm/widthCm/heightCm) are optional. Use when the user wants a new bed or planting area.
```

### `log_curing`

- The name "log_curing" says "log": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
- Findings: warn annotation-conflict

Description, as the server wrote it:

```untrusted-server-text
Record that a harvested crop has finished curing (or dismiss the reminder). Use when the gardener says they've cured, dried, trimmed or stored a crop like garlic, onions or herbs.
```

### `log_event`

- The name "log_event" says "log": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
- Tag private-data: The description's first sentence says "note": it reads notes.
- Findings: warn annotation-conflict

Description, as the server wrote it:

```untrusted-server-text
Record something the user did or observed: watered, fertilized, transplanted, pruned, pest sighting, treatment, frost damage, or a note. Attach it to a plant's active planting via `plant`, to a bed via `bed`, or garden-wide with neither. If both plant and bed are given, the event attaches to the plant's planting.
```

### `record_harvest`

- Nothing in its name or description says what it does, so it is counted as a write.

Description, as the server wrote it:

```untrusted-server-text
Record a harvest, e.g. "I picked 2 kg of cucumbers" or "2 lb of tomatoes". Resolves the plant's active planting automatically. Pounds and ounces are stored as grams.
```

### `set_care_schedule`

- The name "set_care_schedule" says "set": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Create a recurring care schedule (water/fertilize/custom). Scope it to a plant (its active planting), a bed, or the whole garden. Recurrence is EITHER everyDays (e.g. 3) OR weekdays (e.g. ['monday','thursday']). Use when the user wants a repeating watering/feeding reminder. Optionally end it on a date (endsOn) or after N completions (endsAfter); use at most one.
```

## Only reads (16)

Looks things up and changes nothing. Claude Code: allow.

### `get_bed_layout`

- The name "get_bed_layout" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Read a bed's layout grid: the bed's dimensions (cm) plus each placed planting's footprint (xCm, yCm from the bed's top-left; wCm × hCm), and any active plantings not yet placed. Use to reason about space — e.g. "is there 60 cm free at the front of Bed 2?". Positions are written by place_planting.
```

### `get_current_conditions`

- The name "get_current_conditions" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Current weather at the garden (station if connected, else forecast) plus per-bed soil moisture/temperature. Use for "how is the garden right now / should I water".
```

### `get_forecast`

- The name "get_forecast" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
7-day forecast for the garden with overnight-low frost alerts. Use for planting timing, frost protection, watering plans.
```

### `get_harvests`

- The name "get_harvests" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
List harvests with per-plant totals. Use when the user asks what/how much they harvested.
```

### `get_history`

- The name "get_history" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Daily weather history for the garden: min/max temp, rain, growing degree days (base 10 °C) with a cumulative total. Use for "how warm/wet has it been" and growth-progress questions.
```

### `get_plan`

- The name "get_plan" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Upcoming sowing/transplant windows computed from the user's plant catalog and the garden's frost dates, plus zone, frost dates, and any due care tasks (watering/fertilizing, with a rain-skip hint). Use for "what should I plant/start/transplant and when" and "what care is due".
```

### `get_season_plan`

- The name "get_season_plan" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Compute the garden's rest-of-season planting schedule: every bed's next crops, chained forward to the effective first frost, deconflicted across beds with crop rotation and curated sow windows. Returns a PROPOSAL only — nothing is written; use add_planned_planting to accept a row into the succession plan. Returns every bed's chain, or one bed's full chain plus remainingCount for the rest when the garden's plan covers one bed.
```

### `get_soil_readings`

- The name "get_soil_readings" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Latest soil moisture % and soil temperature per bed, with bed names. Use for watering/sowing decisions.
```

### `list_beds`

- The name "list_beds" says "list": a word for reading.
- Tag private-data: The description's first sentence says "list" and "note": it reads notes.

Description, as the server wrote it:

```untrusted-server-text
List the garden's beds: name, type (outdoor_bed/raised_bed/greenhouse/grow_light_shelf/pot), dimensions in cm, notes, and how many active plantings each holds. Use to see what beds exist and where there may be room.
```

### `list_planned_plantings`

- The name "list_planned_plantings" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
List the garden's succession plan — future plantings queued for a bed that haven't been sown yet (only status='planned'; done/skipped entries are omitted). Use when the user asks what's coming up next, what they've planned to plant, or wants to review their succession plan. For plantings already in the ground, use query_plantings instead.
```

### `lookup_frost_dates`

- The name "lookup_frost_dates" says "lookup": a word for reading.
- Tag untrusted-input: The server marks it openWorldHint: true: it reaches things outside the server's own data.

Description, as the server wrote it:

```untrusted-server-text
Average last spring frost, average first fall frost and hardiness zone for any place, from 10 years of weather records. Works without a Siltwell account. Dates are MM-DD. For the signed-in user's own garden, get_plan returns the garden's zone and frost dates, with the frost dates adjusted for its microclimate.
```

### `lookup_frost_risk`

- The name "lookup_frost_risk" says "lookup": a word for reading.
- Tag untrusted-input: The server marks it openWorldHint: true: it reaches things outside the server's own data.

Description, as the server wrote it:

```untrusted-server-text
Forecast lows for the next 7 days at any place and the nights at risk of frost. Each frost night is dated by the morning its low falls on, so protect plants the evening before that date. Works without a Siltwell account. For the signed-in user's own garden, get_forecast returns this forecast with the garden's microclimate adjustment applied.
```

### `lookup_growing_season`

- The name "lookup_growing_season" says "lookup": a word for reading.
- Tag untrusted-input: The server marks it openWorldHint: true: it reaches things outside the server's own data.

Description, as the server wrote it:

```untrusted-server-text
Frost-free season length and seasonal growing degree days at any place, and whether heat-loving crops get enough heat to ripen. Works without a Siltwell account. For the signed-in user's own garden, get_plan returns the microclimate-adjusted frost dates that bound its season, and get_history returns its daily growing degree days.
```

### `lookup_planting_windows`

- The name "lookup_planting_windows" says "lookup": a word for reading.
- Tag untrusted-input: The server marks it openWorldHint: true: it reaches things outside the server's own data.

Description, as the server wrote it:

```untrusted-server-text
When to start seeds indoors, plant out, and sow for a fall harvest at any place, crop by crop, with the days left to sow today. Works without a Siltwell account. Dates are YYYY-MM-DD. Without crops, it returns the 30 crops with the soonest next step; pass crops to see others. For the signed-in user's own garden, get_plan returns sowing and transplant windows for the garden's own plants, counted from its microclimate-adjusted last frost date.
```

### `query_plantings`

- The name "query_plantings" says "query": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
List the user's plantings (what is planted, where, when, how, current status). Use when the user asks what they planted, when something was sown/transplanted, or what's growing in a bed.
```

### `search_events`

- The name "search_events" says "search": a word for reading.
- Tag private-data: The description's first sentence says "search" and "note": it reads notes.

Description, as the server wrote it:

```untrusted-server-text
Search the garden log: watering, fertilizing, transplanting, pruning, pest sightings, treatments, frost damage, notes. Use when the user asks when they last did something or what happened in the garden.
```

## Claude Code permissions

For `.claude/settings.json`, assuming the server is installed as `garden`:

```json
{
  "permissions": {
    "allow": [
      "mcp__garden__query_plantings",
      "mcp__garden__search_events",
      "mcp__garden__get_harvests",
      "mcp__garden__list_beds",
      "mcp__garden__get_bed_layout",
      "mcp__garden__get_current_conditions",
      "mcp__garden__get_soil_readings",
      "mcp__garden__get_forecast",
      "mcp__garden__get_history",
      "mcp__garden__get_plan",
      "mcp__garden__list_planned_plantings",
      "mcp__garden__get_season_plan",
      "mcp__garden__lookup_frost_dates",
      "mcp__garden__lookup_planting_windows",
      "mcp__garden__lookup_growing_season",
      "mcp__garden__lookup_frost_risk"
    ],
    "ask": [
      "mcp__garden__log_event",
      "mcp__garden__record_harvest",
      "mcp__garden__log_curing",
      "mcp__garden__create_bed",
      "mcp__garden__set_care_schedule",
      "mcp__garden__add_planned_planting"
    ],
    "deny": [
      "mcp__garden__add_planting",
      "mcp__garden__update_bed",
      "mcp__garden__update_planting",
      "mcp__garden__delete_planting",
      "mcp__garden__delete_bed",
      "mcp__garden__delete_schedule",
      "mcp__garden__update_harvest",
      "mcp__garden__place_planting",
      "mcp__garden__update_planned_planting",
      "mcp__garden__delete_planned_planting"
    ]
  }
}
```

Capability tags behind the rules (a read tagged outbound is asked about):

- `mcp__garden__search_events`: private-data
- `mcp__garden__list_beds`: private-data
- `mcp__garden__log_event`: private-data
- `mcp__garden__lookup_frost_dates`: untrusted-input
- `mcp__garden__lookup_planting_windows`: untrusted-input
- `mcp__garden__lookup_growing_season`: untrusted-input
- `mcp__garden__lookup_frost_risk`: untrusted-input

## Remote posture

What an anonymous client saw at the remote endpoint, last 2026-10-22T14:40:51.709Z, unchanged since 2026-10-22T14:40:51.709Z. No credentials were sent and no tool was called. Values are shown as the endpoint returned them. Method: https://anlyon.dev/methodology#remote-posture

| Fact | Observed |
| --- | --- |
| Reachable | `yes` |
| HTTP status of an anonymous initialize | `200` |
| tools/list served without credentials | `yes` |
| Tools that change things, listed without credentials | `16` |
| Protocol version | `2025-06-18` |
| WWW-Authenticate on 401 | `not observed` |
| resource_metadata in WWW-Authenticate | `none` |
| RFC 9728 protected resource metadata | `https://app.siltwell.com/.well-known/oauth-protected-resource` |
| Authorization servers | `https://app.siltwell.com` |
| Legacy HTTP+SSE transport | `no` |
| Dynamic client registration | `yes` |
| Client ID metadata documents | `no` |

- **high** Tools that change things, listed to anyone ([unauth-remote-writes](https://anlyon.dev/methodology#unauth-remote-writes))

```untrusted-server-text
The endpoint served tools/list without credentials, and the list has 16 tools that change things (10 destructive, 6 write). Whether a call also works without credentials was not tested: tools are never called.

https://app.siltwell.com/mcp: tools/list returned 32 tools to an anonymous client, including add_planting (destructive), update_bed (destructive), update_planting (destructive), delete_planting (destructive), delete_bed (destructive) and 11 more
```
