Skip to main content
Glama
marcinn2

OpenSprinkler MCP server

by marcinn2

OpenSprinkler MCP Server

MCP server for managing OpenSprinkler controller via Claude Desktop or any MCP-compatible client.

Restriction: Only one controller can be managed at a time. This can be changed in the future if needed, but for now it is a limitation of the design.

Available Tools

Tool

Description

get_controller_status

Get controller status (device time, enabled state, rain delay)

get_stations

Get all stations with their current status

run_station

Start a station for a specified duration

stop_station

Stop a running station

stop_all_stations

Stop all running stations immediately

set_rain_delay

Set rain delay in hours (0 to clear)

enable_controller

Enable or disable the controller

reboot_controller

Reboot the OpenSprinkler controller

view_logs

Get watering history logs for a date range

get_programs

Get all watering programs

get_program

Get full details of a single program by ID

add_program

Add a new watering program

delete_program

Delete a watering program by ID

get_options

Get controller options and settings


Related MCP server: OpenClaw MCP Server

Configuration

Environment Variables

Variable

Description

Default

OPEN_SPRINKLER_HOST

Hostname or IP address of OpenSprinkler

localhost

OPEN_SPRINKLER_PASSWORD

MD5 hash of the controller password

(empty)

OPEN_SPRINKLER_PORT

Port number

80

OPEN_SPRINKLER_TLS

Set to true to use HTTPS

false

OPEN_SPRINKLER_TIMEOUT_MS

Abort a controller request after this many milliseconds

10000

PORT

HTTP port for SSE mode

3000

HOST

Interface to bind in SSE mode. Use 127.0.0.1 to accept only local connections

0.0.0.0

MCP_AUTH_TOKEN

Bearer token required on all HTTP requests (optional)

(unset — no auth)

MCP_ALLOWED_HOSTS

Comma-separated Host header allowlist. When set, other hosts get 403 — this is what blocks DNS-rebinding attacks

(unset — not validated)

MCP_ALLOWED_ORIGINS

Comma-separated Origin allowlist for browser clients. Requests with no Origin are unaffected

(unset — not validated)

Secure Connection (TLS/HTTPS)

If your OpenSprinkler is behind a reverse proxy with HTTPS (e.g. nginx, Traefik), set:

OPEN_SPRINKLER_HOST=opensprinkler.example.com
OPEN_SPRINKLER_PORT=443
OPEN_SPRINKLER_TLS=true

The server will then connect via https://opensprinkler.example.com:443.

Note: OpenSprinkler firmware does not natively support TLS — HTTPS requires a reverse proxy in front of the controller.


Transport Modes

The server supports two transport modes, selected by a command-line argument.

stdio (default)

Used when launched directly by an MCP client (e.g. Claude Desktop). No argument needed:

node dist/index.js

SSE / HTTP (--sse)

Starts an HTTP server that exposes the MCP endpoint over Streamable HTTP (SSE). Use this when you want to run the server as a persistent network service — for example in Docker or Kubernetes — and connect to it from multiple clients or over the network.

node dist/index.js --sse

The server listens on http://${HOST}:${PORT}/mcp (default 0.0.0.0:3000).

Connect your MCP client to: http://<host>:3000/mcp

Bearer Authentication (HTTP mode only)

Set MCP_AUTH_TOKEN to require a bearer token on every HTTP request. If the variable is not set the server accepts all connections (useful for private networks or local use).

MCP_AUTH_TOKEN=mysecrettoken TRANSPORT=http node dist/index.js

Clients must send the header:

Authorization: Bearer mysecrettoken

Requests without a valid token receive 401 Unauthorized. Tokens are compared in constant time. The stdio transport is unaffected — authentication is not applicable there.

Network Hardening (HTTP mode only)

These tools can start and stop watering, disable the controller, reboot it and delete programs, so anyone who can reach the HTTP port can do all of that. In HTTP mode the server binds 0.0.0.0 by default and prints a warning at startup when no token is set.

For anything beyond a trusted private network:

MCP_AUTH_TOKEN=mysecrettoken \
HOST=127.0.0.1 \
MCP_ALLOWED_HOSTS=localhost:3000,127.0.0.1:3000 \
node dist/index.js --sse
  • MCP_AUTH_TOKEN is the primary control — without it the endpoint is open.

  • MCP_ALLOWED_HOSTS defends against DNS rebinding: a malicious web page can make a browser on your network reach 127.0.0.1:3000, but the request still carries the attacker's hostname in the Host header, which the allowlist rejects.

  • HOST=127.0.0.1 keeps the listener off the network entirely. Leave it at the 0.0.0.0 default inside Docker/Kubernetes, where the container needs to accept connections from outside its network namespace.

Legacy SSE (backport compatibility)

For testing with tools that implement the older MCP SSE transport (e.g. mcptools, older inspector versions), the server automatically handles legacy clients on the same /mcp endpoint — no extra flag needed.

How the server distinguishes clients:

Request

Interpreted as

GET /mcp (no mcp-session-id header)

Legacy SSE — opens an event-stream

POST /mcp?sessionId=<id>

Legacy SSE — client sending a message

POST /mcp (with or without mcp-session-id header)

Modern Streamable HTTP

Connecting a legacy client (example with mcptools):

# Start the server
node dist/index.js --sse

# In another terminal
mcp connect http://localhost:3000/mcp

Note: SSEServerTransport is deprecated in the MCP SDK and this compatibility layer is intended for testing only. Production clients should use the modern Streamable HTTP transport.

You can enable verbose debug output during testing by setting NODE_ENV=development:

NODE_ENV=development node dist/index.js --sse

This prints every request, response status, and session lifecycle event to stderr.


Docker

See docs/docker/ for the full deployment guide, Docker Compose file, Claude Desktop configuration options, and troubleshooting steps.


Kubernetes

See docs/kubernetes/ for manifests. Adjust the ConfigMap and Secret for your environment, then:

kubectl apply -k docs/kubernetes/

Claude Desktop (Node.js, no Docker)

{
  "mcpServers": {
    "opensprinkler": {
      "command": "node",
      "args": ["/path/to/opensprinkler-mcp/dist/index.js"],
      "env": {
        "OPEN_SPRINKLER_HOST": "192.168.1.100",
        "OPEN_SPRINKLER_PASSWORD": "your_password"
      }
    }
  }
}

Password

The OpenSprinkler firmware stores whatever string was written when the password was last set. The official app MD5-hashes the password before sending it, so the stored value is an MD5 hash — and OPEN_SPRINKLER_PASSWORD must be the MD5 hash of your password, not the plain text.

Generate it with:

echo -n "your_password" | md5

Contributing

Contributions are welcome. Please open an issue or pull request on GitHub.

Acknowledgements

This project is inspired by the work at github.com/Lumeo-sd/opensprinkler-mcp-sdr. All code was automatically re-created from scratch using AI tools due to lack of LICENSE statement in the original repository.

Disclaimer

  • I am not affiliated with the manufacturers, sellers or any of the device brands. This plugin is a personal project that I maintain in my free time.

  • Refer to the licence for more information.

Available Tools

15 tools
add_programAdd ProgramA

Add a new watering program with weekly or interval scheduling

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesProgram name
enabledYesWhether the program is enabled
station_idsYesStation IDs (0-based) to include
use_weatherYesWhether to apply weather adjustment to this program
days_of_weekNoRequired for weekly type: days to run (e.g. ["monday", "thursday"])
interval_daysNoRequired for interval type: run every N days
schedule_typeYes'weekly': run on specific days of the week; 'interval': run every N days
duration_secondsYesDuration in seconds for each included station (1-64800)
start_time_minutesYesStart time in minutes from midnight (0–1439, e.g. 360 = 6:00 AM)
interval_start_offsetNoFor interval type: starting day offset, must be less than interval_days (default 0 = today)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/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 only states that a program is added with scheduling options; it does not disclose persistence effects, validation behavior, duplicate-name handling, or whether the controller must be reachable.

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. It immediately states the action and the two scheduling modes, making it easy for an agent to grasp the tool's purpose at a glance.

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?

This is a complex 10-parameter creation tool with conditional fields depending on schedule_type, and the description alone leaves out prerequisites such as obtaining station IDs from get_stations and the exact relationship between schedule_type and the conditional parameters. The rich input schema and output schema cover much of the remaining detail, but some contextual gaps remain.

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 schema already documents all 10 parameters. The description's mention of 'weekly or interval scheduling' adds no new semantic detail beyond what the schedule_type enum and field descriptions already provide, so the baseline score of 3 is appropriate.

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 ('Add') with a clear resource ('new watering program') and states the core distinction between weekly and interval scheduling. This clearly separates it from siblings like get_programs, get_program, and delete_program.

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 intended use—creating a new watering program—is implied by the phrase 'Add a new watering program,' but no explicit guidance is given about when to use this tool versus alternatives, nor are prerequisites like obtaining valid station_ids mentioned.

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

delete_programDelete ProgramA

Delete an existing watering program by ID

ParametersJSON Schema
NameRequiredDescriptionDefault
pidYesProgram ID to delete (0-based index from get_programs)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/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 behavioral disclosure burden. 'Delete' clearly communicates destructiveness, but it does not mention permanence, side effects on a running program, or error behavior, leaving some ambiguity for an agent.

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. It states the operation and target immediately and is appropriately sized for a tool with one well-documented parameter.

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 description combined with the complete parameter schema is minimally sufficient for a simple delete operation. However, with no annotations and no mention of side effects, prerequisites, or explicit usage context, it is adequate but not genuinely enriching.

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%, and the pid property already explains that it is a 'Program ID to delete (0-based index from get_programs).' The description adds no meaning beyond 'by ID,' so the baseline of 3 is appropriate.

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 and resource: 'Delete an existing watering program by ID.' This clearly separates it from sibling tools like get_program and add_program, and the scope is unambiguous.

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?

There is no explicit when-to-use or when-not-to-use guidance, and no alternative tools are named. However, deletion is unique among the siblings and the schema's pid description references get_programs, so the intended usage is implied rather than fully spelled out.

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

enable_controllerEnable ControllerA

Enable or disable the controller

ParametersJSON Schema
NameRequiredDescriptionDefault
enabledYesTrue to enable, false to disable

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

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

The description discloses only the core state change, not behavioral consequences such as whether disabling stops active stations, whether the setting persists, or whether special permissions are required. With no annotations provided, the description carries the full burden of behavioral disclosure and does not meet it.

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 one short sentence with no redundancy and the main action is front-loaded. It is appropriately concise for a tool with a single boolean parameter.

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?

Given the simple input schema and presence of an output schema, the basic call is adequately specified. However, because this is a state-changing controller operation with no annotations, the description leaves out important operational context about what disabling actually does, making the definition minimally adequate rather than 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 already covers the single parameter fully, describing enabled as 'True to enable, false to disable' (100% schema description coverage). The tool description restates this same concept without adding new meaning, so the baseline of 3 is appropriate.

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 action verb ('enable'/'disable') applied to a named resource ('the controller'), making the tool's function immediately clear. No sibling tool duplicates this action, so an agent can distinguish enable_controller from get_controller_status, reboot_controller, and similar tools.

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 intended use — toggling the controller's enabled state — is implied by the description, but there is no explicit guidance on when to use it versus alternatives or what conditions should be checked first (e.g., current status, running stations). The guidance is inferable but not stated.

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

get_controller_statusGet Controller StatusA

Get OpenSprinkler controller status including device time, enabled state, rain delay status

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/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. The verb 'Get' and the listed status fields strongly imply a non-mutating read operation, but the description does not explicitly state that no controller settings are changed, nor does it mention failure or offline behavior. For a parameterless status read the risk is low, so a middle score is appropriate.

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 sentence with no filler. It front-loads the action and resource, then lists the key returned data efficiently.

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, parameterless status endpoint, the description is largely complete: it identifies the resource and the main returned data. It could have added a brief note on response format or a direct pointer to get_rain_delay for more detailed rain delay info, but the tool's simplicity limits the need.

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?

The tool has zero parameters and schema description coverage is 100%, so there is no parameter burden for the description to carry. The baseline of 4 applies because no parameter documentation is needed.

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 the action ('Get'), the resource ('OpenSprinkler controller status'), and enumerates concrete returned fields (device time, enabled state, rain delay status), so an agent can distinguish it from station- or program-level tools. However, it does not explicitly differentiate it from the sibling get_rain_delay, which overlaps on the rain delay status field.

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 explicit guidance is provided about when to use this tool versus alternatives such as get_rain_delay, enable_controller, or get_stations. The only usage signal is the implication that this is the controller-level status endpoint, but there are no exclusions or comparisons.

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

get_optionsGet OptionsC

Get controller options and settings

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.9/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. 'Get' implies read-only behavior, but the description does not disclose side effects, required permissions, response format, or any operational caveats.

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

Conciseness3/5

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

Single sentence with no wasted words, which is appropriate for a zero-parameter tool. However, it is so terse that it sacrifices meaningful detail and reads as a label rather than a full definition.

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?

With no annotations and no output schema, the description is the only source of context. It does not explain what specific options/settings are returned, in what format, or whether any prerequisites exist, leaving an agent to guess.

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?

The tool has zero parameters, so there is nothing for the description to add beyond the already complete schema. Baseline 4 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?

States a clear verb+resource: retrieves controller options and settings. It is distinguishable from siblings like get_controller_status and get_stations, though 'options and settings' remains somewhat generic.

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 on when to use this tool versus alternatives. There is potential overlap with get_controller_status (status) or get_programs (settings-like resources), but no exclusions or routing hints are provided.

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

get_programGet ProgramA

Get full details of a single watering program by ID

ParametersJSON Schema
NameRequiredDescriptionDefault
pidYesProgram ID (0-based index from get_programs)

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations provided, the description relies on the verb 'Get' and the phrase 'full details' to signal a read-only retrieval returning complete program information. It does not mention not-found behavior, auth requirements, or what fields constitute 'full details,' but this is minimally adequate for a simple fetch 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?

The description is a single sentence with no filler. The operation, resource, and parameter are all stated clearly and early, so every phrase contributes to selecting and invoking the tool correctly.

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 one-parameter read operation, the description captures the essential contract: fetch all details for one program by ID. The lack of an output schema leaves the return structure unspecified, but the tool is simple enough that this definition is not misleading.

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%; the pid parameter is documented as 'Program ID (0-based index from get_programs),' so the description adds no parameter information beyond what the schema already provides. 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 ('Get') with a clear resource ('single watering program') and the selection criterion ('by ID'). It distinguishes this tool from the sibling get_programs by making 'single' explicit, so an agent can tell them apart without opening the schema.

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 explicit guidance is given about when to use this tool versus get_programs or other siblings. The phrase 'single... by ID' weakly implies per-program access, but no alternatives or exclusions are named.

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

get_programsGet ProgramsA

Get all watering programs

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
programsYes

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are present, so the description must carry the behavioral burden. 'Get all watering programs' implies a read-only listing operation with no side effects, but it does not explicitly state that it is non-mutating, describe result size or pagination, or mention any access requirements. This is minimally adequate but leaves safety traits to inference.

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 four words long, front-loaded with the verb and resource, and contains no filler or redundancy. For a zero-parameter list operation, this is optimally concise.

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 listing operation with an output schema available, the description is nearly complete. It could be improved by explicitly naming get_program as the singular alternative or noting what fields are returned, but the output schema and the simple scope cover most of the need.

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?

The input schema has zero parameters and 100% schema description coverage, so the baseline is 4. The description adds no parameter details, but none are needed since the tool takes no inputs.

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 clear verb ('Get') and a specific resource ('all watering programs'). The plural scope implies a list operation, which distinguishes it from the singular sibling get_program, though the distinction is implicit rather than stated.

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 gives no guidance on when to use this tool versus siblings like get_program, add_program, delete_program, or run_station. The only hint is the word 'all', which implies listing, but no explicit use cases, exclusions, or alternative routing are provided.

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

get_rain_delayGet Rain DelayA

Get the current rain delay status including remaining hours and end date

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
activeYes
endDateYes
hoursRemainingYes

TDQS

A4.3/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 burden of behavioral disclosure. It does communicate the return content and temporal scope, but it does not explicitly state that the operation is side-effect-free or describe behavior when no rain delay is active. 'Get' implies a read, but the description could be more transparent.

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 sentence that front-loads the action and resource, then adds the two key output fields. There is no filler or redundancy; every word contributes useful information.

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

Completeness5/5

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

For a zero-parameter read tool with an output schema, this description provides enough context for an agent to select and invoke it correctly. It names the resource, the temporal scope, and the key returned values, and no additional setup or prerequisite information is needed.

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?

The tool has zero parameters, so there is nothing for the schema to document. The description therefore does not need to add parameter meaning. A baseline of 4 is appropriate because the no-parameter situation is fully clear from the input schema.

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 and resource: 'get the current rain delay status.' It further specifies what is included ('remaining hours and end date'), which clearly distinguishes it from sibling tools like set_rain_delay. An agent can tell this is a read operation for current delay state.

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 word 'current' indicates this tool is for reading the active rain delay state, and the sibling set_rain_delay implies the complementary write operation. However, the description does not explicitly spell out when not to use it or name alternative tools, so it falls just short of a 5.

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

get_stationsGet StationsA

Get all stations with their current status (running, enabled, names, seconds remaining)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
stationsYes

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 behavioral burden. It signals a read-only operation and lists returned fields, but it does not clarify semantics like what 'seconds remaining' refers to, whether disabled stations are included, or whether the data is live versus cached.

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 with no filler. The parenthetical field list is compact and meaningfully specifies what 'current status' includes.

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 getter with no parameters and an existing output schema, the description is largely complete. It could add a brief note about selecting this tool over related status tools, but that gap is primarily a usage-guidance issue.

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 parameter-level documentation is unnecessary. The description adds useful scope by stating 'all stations' and listing the response contents, meeting the baseline for a param-less tool.

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?

States a concrete verb and resource ('Get all stations') and enumerates the returned status fields (running, enabled, names, seconds remaining). This clearly distinguishes it from controller, program, and action-oriented 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 Guidelines3/5

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

The description implies this is the tool for retrieving station status, but it does not explicitly say when to use it versus alternatives like get_controller_status. No exclusions or alternative routing are provided.

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

reboot_controllerReboot ControllerA

Reboot the OpenSprinkler controller

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/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. 'Reboot' implies a disruptive action, but the description does not mention that active operations may be interrupted, the controller may become temporarily unavailable, or that reconnection may be required.

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 short sentence with no filler. It states the action and target resource directly, earning its place without unnecessary detail.

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?

For a zero-parameter tool with an output schema, the invocation contract is essentially complete. However, because this is a state-changing operation with no annotations, the absence of any warning about reboot consequences leaves the contextual picture incomplete.

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?

The tool has zero parameters, so there is nothing for the description to explain beyond what the schema already shows. This matches the baseline for parameterless tools.

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 names a specific action, 'Reboot', and a specific resource, 'the OpenSprinkler controller'. This clearly distinguishes it from sibling tools like enable_controller or stop_all_stations, whose purposes are different.

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 intended use is implied by the verb 'Reboot'—use it when a controller restart is needed. However, the description gives no explicit conditions, exclusions, or alternatives, such as when enable_controller would be more appropriate.

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

run_stationRun StationA

Start a station for a specified duration

ParametersJSON Schema
NameRequiredDescriptionDefault
station_idYesStation ID (0-based index)
duration_minutesYesDuration in minutes (1-1080; the controller caps a single run at 64800 seconds)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/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 only states that a station is started, but it does not mention side effects such as whether an already-running station is overridden, whether the command is asynchronous, or what happens on failure. This is a notable gap for a tool that mutates controller state.

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. Every word contributes to understanding the tool's function, and the core action is front-loaded.

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 tool with a complete input schema and an output schema present, the description is mostly sufficient. The main missing piece is behavioral context around what happens when the station is started, but the operation is simple enough that the one-line description covers the essential invocation intent.

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 parameters are already fully documented in the input schema. The description adds no parameter-level meaning beyond what the schema provides, which matches the baseline expectation for high schema coverage.

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 action, 'Start a station,' and the key qualifier 'for a specified duration,' which clearly separates it from sibling tools like stop_station and get_stations. It is not a tautology and immediately identifies the resource and behavior.

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 makes the use case clear: invoke this tool when you want to start a station with a timed duration. It does not explicitly name alternatives or exclusions, but the sibling tool names (stop_station, stop_all_stations, get_stations) make the intended contrast obvious without further explanation.

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

set_rain_delaySet Rain DelayA

Set rain delay in hours (0 to clear)

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursYesNumber of hours for rain delay (0 to clear)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/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 behavioral disclosure burden. It usefully discloses that setting hours to 0 clears the rain delay, but it does not state whether the delay applies to the whole controller, what side effects occur, or whether the operation is reversible beyond setting 0.

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 sentence that front-loads the verb and target. Every word earns its place, and there is no filler or redundancy.

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?

Given the tool's low complexity, one fully documented parameter, and presence of an output schema, the description is nearly sufficient. The main gaps are the lack of effect-scope information and explicit usage guidance, but these are minor for such a simple setter.

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%, and the schema already documents 'hours' with type, range, and the '0 to clear' semantics. The description repeats this meaning without adding extra detail.

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 and resource: 'Set rain delay in hours'. It clearly identifies this as the mutating counterpart to the sibling get_rain_delay, so an agent can distinguish it without opening the schema.

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 use this tool versus alternatives, no mention of prerequisites, and no indication that get_rain_delay is the read-only alternative. Usage is only implied by the action name.

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

stop_all_stationsStop All StationsA

Stop all running stations immediately

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. It clearly states the scope (only running stations) and immediacy, but it does not explain side effects such as whether scheduled programs are canceled, whether the action is idempotent, or what response to expect.

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 six-word sentence with no filler. It front-loads the action and scope, and every word contributes meaning.

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 command with an output schema, the description is largely complete: the agent knows exactly what will happen. The only missing context concerns whether stopping also impacts future scheduled runs, but the phrase 'running stations' limits the scope and the output schema can cover return details.

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?

The input schema has zero properties, so there are no parameters to document; the 100% schema coverage is vacuously satisfied. The baseline of 4 for a parameterless tool applies, and the description adds nothing needed.

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 ('Stop'), a clear resource ('all running stations'), and a temporal qualifier ('immediately'), making the action unmistakable. The 'all' qualifier distinguishes it from the sibling stop_station, which presumably targets a single station.

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 makes the use case evident: invoke when every currently running station needs to be halted. It does not explicitly name alternatives or exclusions (e.g., 'use stop_station for a single station'), so it stops short of a 5.

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

stop_stationStop StationA

Stop a running station

ParametersJSON Schema
NameRequiredDescriptionDefault
station_idYesStation ID (0-based index)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the full burden of behavioral disclosure. It only states 'Stop a running station' without mentioning what happens if the station isn't running, whether the operation is idempotent, or what side effects it might have on programs/schedules. This is a notable gap for a state-changing 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?

The description is a single short sentence with no wasted words. It is front-loaded with the action and target, making it immediately scannable and easy to parse.

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?

With one simple parameter, 100% schema coverage, and an output schema present, the description does not need to explain return values. However, given no annotations and sibling tools like stop_all_stations, the description could provide more context about exact scope and behavior. Its brevity leaves some operational ambiguity.

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 already documents station_id with a clear description ('Station ID (0-based index)') and coverage is 100%. The description adds no additional parameter meaning, so it meets the baseline without needing to compensate for missing schema information.

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 ('stop') and resource ('station'), and the qualifier 'running' helps distinguish it from stopping all stations or starting one. It is not a tautology and clearly identifies the tool's core action at the intended scope.

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 phrase 'a running station' implies this is for stopping one active station, but there is no explicit guidance about when to use this versus stop_all_stations or run_station. Usage context is implied rather than stated, leaving some interpretation to the agent.

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

view_logsView LogsA

Get watering history logs for a date range. Dates are interpreted in the controller's local timezone.

ParametersJSON Schema
NameRequiredDescriptionDefault
date_toYesEnd date in YYYY-MM-DD format (inclusive)
date_fromYesStart date in YYYY-MM-DD format (inclusive)

TDQS

A4/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 full behavioral disclosure burden. It adds a useful timezone interpretation detail, but does not explicitly state read-only behavior or describe the shape/volume of returned logs.

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?

Two short sentences deliver the essential purpose and the key timezone caveat without redundancy. The main action 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 simple two-parameter read operation, the description covers the core requirements: what is retrieved, the date-range constraint, and timezone interpretation. The lack of an output schema means some return details are unspecified, but the definition is still adequate for correct invocation.

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 schema fully documents both parameters. The description adds the timezone context but no extra parameter-level meaning 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 uses a specific verb ('Get') with a clear resource ('watering history logs') and a scoping condition ('for a date range'). It is immediately distinguishable from all sibling tools, none of which are log-related.

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 indicates when to use the tool: when watering history logs are needed for a date range. It does not explicitly name alternatives or exclusions, but no sibling tool overlaps with this purpose.

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. 15 tool updatesv0.2.6
    • First observedadd_program
    • First observeddelete_program
    • First observedenable_controller
    • First observedget_controller_status
    • First observedget_options
    • First observedget_program
    • First observedget_programs
    • First observedget_rain_delay
    • First observedget_stations
    • First observedreboot_controller
    • First observedrun_station
    • First observedset_rain_delay
    • First observedstop_all_stations
    • First observedstop_station
    • First observedview_logs

TDQS

A3.7/5.0
Disambiguation4/5

Most tools target distinct resources and actions: stations, programs, rain delay, controller status, and logs are clearly separated. The only mild overlap is between get_controller_status and get_options, since both touch controller-level settings, but their descriptions are distinct enough to avoid serious misselection.

Naming Consistency4/5

The naming largely follows a consistent verb_noun pattern: get_* for reads, plus run_station, stop_station, set_rain_delay, enable_controller, and add/delete_program. The main inconsistency is view_logs instead of get_logs, and stop_all_stations is a slightly expanded variant of stop_station.

Tool Count5/5

Fifteen tools is at the upper end of the ideal range, but each tool covers a meaningful controller operation without redundancy. The count feels appropriate for the scope of an irrigation controller server, and no tools are mere duplicates.

Completeness4/5

The tool surface covers the core workflows well: station control, rain delay, controller status, logs, and program lookup/creation/deletion. The most notable gap is the lack of an update_program tool, so existing programs cannot be edited directly, though agents could work around this by deleting and re-adding.

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

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/marcinn2/opensprinkler-mcp'

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