Skip to main content
Glama
gotylergo

HortusFox MCP Server

by gotylergo

HortusFox MCP Server 🌿🦊

A Model Context Protocol (MCP) server for HortusFox, the self-hosted collaborative plant management system.

Connect your AI coding assistants (Claude Code, Cursor, Antigravity, OpenCode, Windsurf) directly to your home garden database to inspect plant health, query watering schedules, log care events, and update timestamps.

Note: This project is open-source, community-driven, and was vibe-coded / AI-assisted with Google Antigravity pair programming.


Features

  • Flexible Connectivity: Connect to local LAN instances or remote instances behind reverse proxies and authentication gateways.

  • Rich Care Tools:

    • list_plants: Overview of active plants, species, locations, and care dates.

    • get_plant_details: In-depth attributes (both default and custom fields like "Last pruned", "Soil moisture", etc.).

    • get_plant_history: Full audit trail of care logs, measurements, and status updates.

    • add_plant_log: Record watering, repotting, or health observations directly from conversation, with automatic timestamp synchronization!

    • search_plants: Fuzzy search across botanical names, common names, and tags.

    • list_locations: Discover garden zones (e.g. Indoor, Balcony, Greenhouse).

    • update_plant_attribute: Modify attributes (last_watered, last_repotted, health_state, notes).

    • list_inventory & update_inventory_amount: Monitor and update garden supplies and substrate stock.


Related MCP server: MCP Database Manager

Tool Reference

Tool

Arguments

Description

list_plants

location_id (optional), limit (optional)

Retrieve active plants and their care status.

get_plant_details

plant_id (required)

Get comprehensive plant specs and custom attributes.

get_plant_history

plant_id (required), limit (optional)

Fetch historical activity logs and notes for a plant.

add_plant_log

plant_id (required), notes (required), action (optional), update_timestamp (optional, default: true)

Add care note. If action is watered, fertilized, or repotted, auto-updates the plant's date!

search_plants

query (required), limit (optional)

Search plants across all locations.

list_locations

None

List all registered growing locations.

update_plant_attribute

plant_id (required), attribute (required), value (required)

Directly update an attribute (e.g. last_watered: "2026-09-05").

list_inventory

group (optional)

Retrieve inventory items (fertilizers, substrates, pest control, supplies) and stock counts.

update_inventory_amount

item_id (required), action (required: 'inc' | 'dec')

Increment or decrement stock count of an inventory item.


Prerequisites

  1. Node.js 18+ and npm.

  2. HortusFox v3.1+ instance with API enabled:

    • In HortusFox, navigate to Admin Panel -> API.

    • Generate an API Key.


Installation & Build

git clone https://github.com/gotylergo/hortusfox-mcp.git # or local folder
cd hortusfox-mcp
npm install
npm run build

The compiled server entrypoint is located at dist/index.js.


Configuration & Environment Variables

Variable

Description

Example

HORTUSFOX_URL

Base URL of your HortusFox instance.

http://localhost:8080 or https://plants.example.com

HORTUSFOX_API_TOKEN

HortusFox API token generated in Admin -> API.

your_api_token_here

HORTUSFOX_CUSTOM_HEADERS

(Optional) JSON map of custom HTTP headers (e.g. reverse proxy or auth tokens).

{"X-Custom-Auth":"secret"}

CF_ACCESS_CLIENT_ID

(Optional) Shorthand for Cloudflare Access Service Token Client ID.

xxxx.access

CF_ACCESS_CLIENT_SECRET

(Optional) Shorthand for Cloudflare Access Service Token Client Secret.

xxxx


Registering with MCP Clients

Claude Desktop / Claude Code (claude_desktop_config.json)

{
  "mcpServers": {
    "hortusfox": {
      "command": "node",
      "args": ["/absolute/path/to/hortusfox-mcp/dist/index.js"],
      "env": {
        "HORTUSFOX_URL": "http://localhost:8080",
        "HORTUSFOX_API_TOKEN": "YOUR_API_TOKEN"
      }
    }
  }
}

Cursor (~/.cursor/mcp.json)

{
  "mcpServers": {
    "hortusfox": {
      "command": "node",
      "args": ["/absolute/path/to/hortusfox-mcp/dist/index.js"],
      "env": {
        "HORTUSFOX_URL": "http://localhost:8080",
        "HORTUSFOX_API_TOKEN": "YOUR_API_TOKEN"
      }
    }
  }
}

Antigravity / Gemini CLI (~/.gemini/antigravity/mcp_config.json)

{
  "mcpServers": {
    "hortusfox": {
      "command": "node",
      "args": ["/absolute/path/to/hortusfox-mcp/dist/index.js"],
      "env": {
        "HORTUSFOX_URL": "http://localhost:8080",
        "HORTUSFOX_API_TOKEN": "YOUR_API_TOKEN"
      }
    }
  }
}

OpenCode (~/.config/opencode/opencode.jsonc)

{
  "mcp": {
    "hortusfox": {
      "type": "local",
      "command": ["node", "/absolute/path/to/hortusfox-mcp/dist/index.js"],
      "environment": {
        "HORTUSFOX_URL": "http://localhost:8080",
        "HORTUSFOX_API_TOKEN": "YOUR_API_TOKEN"
      }
    }
  }
}

Authentication Proxies & Custom Headers

If your HortusFox instance is protected by an authentication gateway (such as Cloudflare Access, Authelia, or an OAuth proxy), pass custom headers via HORTUSFOX_CUSTOM_HEADERS:

"env": {
  "HORTUSFOX_URL": "https://plants.example.com",
  "HORTUSFOX_API_TOKEN": "YOUR_API_TOKEN",
  "HORTUSFOX_CUSTOM_HEADERS": "{\"CF-Access-Client-Id\": \"...\", \"CF-Access-Client-Secret\": \"...\"}"
}

For Cloudflare Access specifically, CF_ACCESS_CLIENT_ID and CF_ACCESS_CLIENT_SECRET can also be supplied directly as environment variables.


License

MIT

Available Tools

9 tools
add_plant_logB

Log watering, repotting, fertilization, or observation notes for a plant directly from conversation.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesYesThe log message or notes describing the care action or observation.
actionNoThe primary care category (default: "general").
plant_idYesThe unique ID of the plant.
update_timestampNoIf true and action is "watered", "fertilized", or "repotted", automatically update the plant attribute date to today (default: true).

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral disclosure burden. It only states 'Log...' without mentioning side effects, such as automatically updating plant attribute dates when action is 'watered', 'fertilized', or 'repotted'. It also does not describe the outcome or return value, leaving key behavioral traits undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. Every word earns its place, and the main action is immediately clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple and the schema fully documents its parameters, so the description does not need to repeat parameter details. However, because there is no annotation coverage, the description should have mentioned the automatic date-update side effect and what happens after logging, which it does not.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description loosely maps to the 'action' enum by listing watering, repotting, fertilization, and observation notes, but it does not add meaningful new meaning beyond the schema's parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb ('Log') and resource ('plant log') and lists the supported care categories (watering, repotting, fertilization, observation). It makes the tool's primary function obvious and distinguishable from sibling tools like get_plant_history, though it does not explicitly contrast itself with any sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: an agent should use this when a user reports a care action or observation in conversation. However, there is no explicit when-not-to-use guidance or mention of alternative tools, so the agent must infer the decision boundary from the description alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_plant_detailsB

Get deep plant information, care attributes, last watered/fertilized timestamps, and custom properties.

ParametersJSON Schema
NameRequiredDescriptionDefault
plant_idYesThe unique ID of the plant.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral burden. It does reveal that the result includes care attributes, timestamps, and custom properties, which implies a read-only fetch and gives useful return-content context. It does not discuss error behavior, permissions, or response shape, but this is a simple get-by-ID operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence delivers the core action and the main output categories without filler. The most important information is front-loaded and every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity get-by-ID tool with one parameter and no output schema, the description is largely sufficient: it names the expected return content. It could be more complete by stating not-found behavior and explicitly confirming it returns a single plant object, but nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with plant_id already documented in the input schema. The description adds no extra meaning about the parameter beyond what the schema provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Get') and resource (plant details) and enumerates concrete content: care attributes, last watered/fertilized timestamps, and custom properties. This distinguishes it from list_plants and get_plant_history, though it does not explicitly name these siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to choose this tool over related alternatives such as list_plants or get_plant_history. The description only states what the tool returns; it does not say when it is appropriate or list any exclusions, prerequisites, or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_plant_historyA

Retrieve historical log events, care notes, watering records, and observations for a plant.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of log entries to retrieve (default: 15).
plant_idYesThe unique ID of the plant.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden. It does disclose the read-only nature via 'Retrieve' and enumerates the categories of data returned. However, it omits details like ordering, pagination behavior, or how the history entries are structured, which are relevant but not critical for a read tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence, front-loaded with the verb and resource, and it efficiently lists the key content types without redundant words. Every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is low-complexity: one required parameter, one optional parameter documented in the schema, and no output schema. The description clearly scopes what data is returned. While no ordering or response format is given, the scope and parameters are fully covered for a read-only history tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100% with both plant_id and limit clearly documented. The tool description does not need to add parameter semantics, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb, 'Retrieve,' and identifies a clear resource: historical log events, care notes, watering records, and observations for a plant. This distinguishes it from siblings like get_plant_details (current details) and add_plant_log (adding logs), even without naming them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context: use this when you need a plant's historical data. However, it does not explicitly state when not to use it or name alternatives like get_plant_details for current info, leaving some selection ambiguity for an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_inventoryA

Retrieve inventory items (fertilizers, substrates, pest control, supplies) and stock counts from HortusFox.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupNoOptional group category filter (e.g. "fertilizers", "pest-control", "substrates").

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral disclosure burden. It accurately signals a non-mutating retrieval operation and names the data returned, but it does not disclose pagination, default behavior when no group is specified, or response formatting. This is adequate for a simple list tool but lacks rich behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence delivers the essential information without filler or redundancy. It earns its place by naming the resource, the item categories, and the stock-count aspect concisely.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with one optional parameter and no output schema, the description plus input schema provide adequate context: what is retrieved, what categories exist, and that filtering is possible. The only minor gap is not explicitly stating that omitting group returns all inventory items, but this is inferable from the optional schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully documents the only parameter (group) with type, optionality, and example values, so schema coverage is 100%. The description adds useful domain context by enumerating inventory categories, but it does not materially extend the parameter semantics beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Retrieve'), a clear resource ('inventory items'), and the scope (fertilizers, substrates, pest control, supplies, stock counts). This clearly distinguishes the tool from siblings like list_plants or search_plants by identifying an inventory-specific domain.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context that this is the read-oriented inventory tool, which logically distinguishes it from the mutation-focused sibling update_inventory_amount. It does not explicitly state exclusions or alternative routing instructions, but the context is strong enough for an agent to infer when to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_locationsA

List all growing locations (e.g. Balcony, Indoor, Garden) in HortusFox.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must carry the behavioral disclosure. The word 'list' implies a read-only operation with no side effects, and 'all' indicates the scope. However, it does not explicitly state that no modifications occur or describe the return format, which is a minor gap for a simple list endpoint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that states the action, resource, and illustrative examples. Every word earns its place with no repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, side-effect-free listing tool, the description is nearly complete. It lacks an explicit mention of output structure, but that is not critical for a list of simple named locations. It is sufficient for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the input schema is trivially complete. The description adds meaningful context by naming example values, which helps the agent understand what 'locations' means. The baseline of 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('list') and resource ('growing locations') with concrete examples (Balcony, Indoor, Garden). This unambiguously distinguishes it from sibling tools like list_plants or list_inventory, which target different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies when to use this tool: whenever the agent needs the full set of growing locations in HortusFox. It does not explicitly mention alternatives, but the resource is unique enough among siblings that no exclusion is strictly necessary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_plantsB

Retrieve active plants, species, locations, and care statuses from HortusFox.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of plants to return (default: all).
location_idNoOptional location ID to filter plants (e.g. 1 for Balcony, 2 for Indoor).

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral burden. It conveys a read operation and that only active plants are returned, but does not explain the meaning of 'active', how location_id/limit affect results, or any response-shape expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no filler or repeated schema content. Every word contributes to stating what the tool returns.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, parameters are fully documented, and the description names the core returned data. However, with no annotations or output schema, and several sibling plant tools, it would benefit from clarifying when to list vs. search and what 'active' means.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents both parameters completely, so the description does not need to add much. The description adds no new parameter-level meaning beyond the schema, matching the baseline for 100% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Retrieve') and resource ('active plants'), and lists the included data fields (species, locations, care statuses). It is clearly about plants rather than locations, but it does not explicitly distinguish listing from search_plants.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies a general listing use case but gives no guidance on when to prefer this over search_plants, get_plant_details, or other siblings. No exclusions or alternative conditions are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_plantsA

Search for plants across all locations by name, scientific name, or tag.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (default: 10).
queryYesSearch keyword (common name or scientific name).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral context, and it delivers by clarifying that search scope spans all locations and that matching includes tags as well as the schema's name fields. This is useful beyond the schema, though it does not describe result shape or pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence front-loads the verb and resource, then lists the search dimensions and scope. There is no filler, and every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter search tool, the description covers the key decision inputs: what to search, how the query works, and the global scope. It stops short of naming the most similar sibling (list_plants) or describing the expected response, but given the tool's simplicity these are modest gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, putting the baseline at 3. The description adds meaning by expanding 'query' to include tags and by bounding the search to all locations, which clarifies what the query parameter affects beyond the schema's own text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description names a specific verb ('Search'), a clear resource ('plants'), and a precise scope ('across all locations'), plus the three matching dimensions (name, scientific name, tag). This distinguishes it from list_plants, which would be the browse-all alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it: any time you want to find plants by keyword rather than enumerating them. However, it never explicitly contrasts with list_plants or states when not to use it, so the usage guidance is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_inventory_amountB

Increment or decrement the stock count of an inventory item in HortusFox.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhether to increment ("inc") or decrement ("dec") the item count.
item_idYesThe unique ID of the inventory item.

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It clearly indicates a mutation, but it does not mention side effects, whether decrementing below zero is allowed, persistence, permissions, or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence with no filler. The operation and target are front-loaded, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple and both parameters are fully documented in the schema, so the core call is well supported. However, with no output schema and no behavioral or usage context, an agent is left guessing about return values, failure modes, and edge cases. It is adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides descriptions for both required parameters with 100% coverage, including the inc/dec enum for 'action'. The description itself adds no parameter-level meaning beyond what the schema already documents, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Increment or decrement') and names the exact resource ('stock count of an inventory item in HortusFox'), so an agent can tell what the tool does. It is distinct from list_inventory, though it does not explicitly differentiate itself from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to choose this tool over alternatives such as list_inventory, nor any context about prerequisites or constraints. The intended usage is only implied by the operation itself, not stated explicitly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_plant_attributeC

Directly update a plant default attribute (e.g., last_watered, last_fertilised, last_repotted, health_state, notes).

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesNew value for the attribute (for dates use YYYY-MM-DD).
plant_idYesThe unique ID of the plant.
attributeYesAttribute name (e.g., "last_watered", "last_fertilised", "last_repotted", "health_state", "notes").

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure, but it only states that the tool 'update[s]' an attribute. It does not mention whether the update overwrites existing values, whether it creates history entries, what permissions are needed, or what the outcome looks like.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single focused sentence that is easy to parse and immediately communicates the tool's purpose with concrete examples. No unnecessary words or redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with no annotations and no output schema, the description is too sparse. It lacks context about side effects, prerequisites, return behavior, and how it relates to other plant-management tools, so an agent has to infer important details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all three parameters. The description adds useful example attribute names, but it does not meaningfully extend the parameter semantics beyond that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action ('Directly update') on a specific resource ('plant default attribute') and provides concrete attribute examples. It is understandable on its own, though it does not explicitly distinguish itself from sibling tools like add_plant_log.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus alternatives such as add_plant_log or update_inventory_amount. The word 'Directly' hints at a distinction but does not explain the appropriate context or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 9 tool updatesv1.0.0
    • First observedadd_plant_log
    • First observedget_plant_details
    • First observedget_plant_history
    • First observedlist_inventory
    • First observedlist_locations
    • First observedlist_plants
    • First observedsearch_plants
    • First observedupdate_inventory_amount
    • First observedupdate_plant_attribute

TDQS

A3.6/5.0
Disambiguation4/5

Most tools map to clearly distinct resources and actions: plants, plant history, locations, and inventory. The only minor ambiguity is between search_plants and list_plants, which both return plant collections but differ in query flexibility.

Naming Consistency5/5

All tool names follow a consistent lowercase snake_case verb_noun pattern, with clear verbs like search, list, get, add, and update. There is no mixing of styles or vague names.

Tool Count5/5

Nine tools is a well-scoped set for a plant management server, covering retrieval, updates, logging, and inventory without unnecessary redundancy. Each tool has a clear role.

Completeness3/5

The read, update, and logging operations are solid, but the set lacks create or delete operations for plants, locations, and inventory items. This creates a notable lifecycle gap for agents managing a HortusFox collection.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Connects AI assistants like Claude Desktop directly to MySQL databases, enabling natural language interaction for schema inspection, data querying, CRUD operations, and database administration tasks.
    21
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to interact with and manage multiple database types (PostgreSQL, MySQL, SQLite, SQL Server, MongoDB, Redis) through natural language, supporting query analysis, schema management, data analysis, backup/restore, and security analysis.
    10
    2
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to connect to and interact with PostgreSQL, MySQL, SQLite, and MongoDB databases through natural language, supporting schema exploration, query execution, data export, and more.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to directly query MySQL databases, list tables, and view table structures through natural language.
    33
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/gotylergo/hortusfox-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server