baseline-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@baseline-mcpwhat are the current alarms on my controllers?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
baseline-mcp
An MCP server for the Baseline / BaseManager irrigation controller system at baselineapps.net.
Scope: read-only. Status, alarms, and reporting. No watering/control or schedule-edit endpoints are exposed.
Tools
Tool | What it returns |
| Logged-in user, access level, company, assigned controller ids. |
| Organizations this account can access (for multi-org accounts). |
| Sites and controllers across all accessible organizations, with model, firmware, subscription, and device counts. |
| Live snapshot: controller + per-zone + per-device status codes and decoded sensor readings. |
| Zone config: number, name, decoder, enabled, designed/learned flow, hydrozone agronomy. |
| Active alarms/faults, decoded (sender device + fault type). |
| Vendor maintenance banners as plain text. |
| Enumerate all devices by type (zones, flow meters, sensors, valves, pumps…), each with the |
| Watering programs with last/next start & finish, duration, water used, and assigned zones. |
| Current live reading for one device by serial — pressure (PSI), flow (water usage), moisture (%VWC), zone/valve/pump run state. |
| Modern reporting time-series for one device — historical pressure, moisture, temperature, flow, or zone runtime — with max/min/avg/median + points. |
| Legacy time-series report (water usage, runtimes, moisture, flow) as timestamp/value points. |
Core model: enumerate → live or history
The intended workflow is enumerate objects, then ask for live or historical data on one:
baseline_list_devices(orbaseline_get_programs) → each object carries areportingSn.baseline_get_live{ deviceSn }→ its current reading.baseline_get_history{ kind, deviceSn, from, to, granularity }→ its trend.
deviceSn is the same key for both: a sensor/meter serialNumber, or a zone decoderSN.
baseline_get_history uses the newer Analytics reporting API (/baseservice2/reporting/…)
and is the only source for historical pressure. baseline_get_report is the older
getData.php path, kept for water-usage/runtime aggregates.
Accounts, organizations & controllers
A controller is the primary key for every data tool; organizations (companies) are a grouping.
Some accounts can access multiple organizations and controllers. Tools that take a
controllerId resolve it in this order:
the explicit
controllerIdargument, elsethe
BASELINE_CONTROLLER_IDenv default, elsethe sole accessible controller (when there's exactly one).
If several controllers are accessible and none is specified, the tool returns the list so you
can pick one. baseline_list_companies → baseline_list_controllers enumerates everything.
Set BASELINE_COMPANY_ID to restrict enumeration to one organization, and/or
BASELINE_CONTROLLER_ID to pin a default controller.
Report types
baseline_get_report accepts: WaterUsage, ZoneRuntimes, ZonesActivity,
ControllerActivity, MoistureLevels, Temperature, FlowMeterTotals,
RainfallAccumulation, MeasuredFlow, ExpectedFlow. Dates are YYYY-MM-DD HH:mm;
resolution is daily or hourly; pass id to scope to a single zone/device.
Setup
npm install # also builds via the prepare hook
npm run build # or build explicitlyProvide credentials via environment variables (BASELINE_USERNAME, BASELINE_PASSWORD).
The server logs in lazily, caches the SID session cookie, and re-authenticates on expiry.
Register with an MCP client
Claude Code / Claude Desktop (claude_desktop_config.json or .mcp.json):
{
"mcpServers": {
"baseline": {
"command": "node",
"args": ["/absolute/path/to/baseline-mcp/dist/index.js"],
"env": {
"BASELINE_USERNAME": "your-username",
"BASELINE_PASSWORD": "your-password"
}
}
}
}Or with the Claude Code CLI:
claude mcp add baseline \
-e BASELINE_USERNAME=your-username \
-e BASELINE_PASSWORD=your-password \
-- node /absolute/path/to/baseline-mcp/dist/index.jsVerify
# Exercise the HTTP client against the live API (read-only):
BASELINE_USERNAME=... BASELINE_PASSWORD=... npm run smoke
# Exercise the MCP protocol layer (spawns the server, lists + calls tools):
BASELINE_USERNAME=... BASELINE_PASSWORD=... npm run mcp-checkNotes & caveats
Lenient HTTP parsing. Baseline returns a malformed multi-line
Content-Security-Policyheader that Node's defaultfetch/undici parser rejects. The client usesnode:httpswithinsecureHTTPParser: trueto tolerate it (browsers do the same). TLS verification stays on.Inferred codes. Status-key meanings (
VA,VP,VR, …) and alarm suffixes were inferred from observed data, not vendor docs. Decoders always include the raw code, andstatusTextis passed through verbatim. Seesrc/codes.ts.Endpoints are unofficial and may change without notice.
Project layout
src/
index.ts MCP server + tool definitions
client.ts BaselineClient: session lifecycle, JSON + report fetches
http.ts node:https transport (lenient parser)
format.ts payload-shaping helpers
codes.ts status / alarm / device code decode tables
scripts/
smoke.ts live API smoke test
mcp-check.ts MCP protocol smoke test
research/
API-REFERENCE.md API observationsResources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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/swannman/baseline-irrigation-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server