# Charts & guides

SolarSENS MCP serves its data through tools. The assistant discovers Plants and reads bounded results through the tools in the [tool reference](https://ai.solarsens.co/docs/api-reference/tools.md).

It does not expose arbitrary files, database tables, object storage, or backend resources to the assistant.

## Plant chart UI resource

These resources are served when the Worker sets `MCP_APPS` to `"true"`, as production does. When the flag is off, the server does not list them and adds no UI metadata to any tool.

| URI                                             | MIME type                   | Linked from                                             |
| ----------------------------------------------- | --------------------------- | ------------------------------------------------------- |
| `ui://solarsens/plant-chart/v2-<build-id>.html` | `text/html;profile=mcp-app` | `get_plant_chart`, through `_meta.ui.resourceUri`       |
| `ui://solarsens/plant-chart/v1.html`            | `text/html;profile=mcp-app` | Compatibility alias for older cached tool metadata only |

The build ID is the first 12 hexadecimal characters of the SHA-256 of the self-contained generated HTML, including its JavaScript and CSS. It is computed by `pnpm apps:build`, not per request. Any changed bundle gets a new resource URI, so the host cannot reuse a previous bundle under the new cache key. The v1 alias serves the corrected renderer when re-read; it cannot replace an already cached or already open iframe.

After deploying a widget update, refresh the SolarSENS connector's tool metadata and make a new chart request. Reopening an old result alone may still show its cached widget. Published hosts may require their normal metadata-review process before adopting a changed resource URI.

A host that supports MCP Apps loads the resource and sends it the `get_plant_chart` result. The page draws the Plant chart with hover values, zoom, and a Plant-local time axis. It shows values as SolarSENS returned them. A missing timestamp or a JSON null appears as a gap, and the string `"0"` is shown as zero. When the server reports that coverage was not checked, the page shows a "Coverage not checked" badge.

The diagnostic footer shows the widget version, bundle build ID, and the request's correlation UUID. Parser failures include a bounded reason such as `INVALID_DIMENSIONS`, `INVALID_ROW_SHAPE`, or `NO_READABLE_TIMESTAMPS`. `TOOL_ERROR` and `HOST_CONNECTION_FAILED` identify different failure layers. Missing or invalid IDs are shown as unavailable; raw chart rows, credentials, and arbitrary error objects are never included in the diagnostic footer.

The page is self-contained. It declares an empty content security policy (no network or external domains), loads no external script, and calls no tools. Hosts that do not support MCP Apps still receive the normal `get_plant_chart` tool result.

## Review performance

The skill is served when the Worker sets `MCP_SKILLS` to `"true"`, as production does. The server serves `skill://solarsens/plant-performance-review/SKILL.md` through the Skills extension (`skills/list`, `skills/get`, and `resources/read`). It is the same daily PR triage procedure as the optional prompt in [Check templates](https://ai.solarsens.co/docs/api-reference/prompts.md). Clients that do not implement the Skills extension see it as an ordinary read-only resource. Production enables it.

## Review strings

`skill://solarsens/string-fault-review/SKILL.md` is served with `MCP_SKILLS` set to `"true"` when all required tools are served. It uses the same procedure as the `string-fault-review` prompt and the [Review strings](https://ai.solarsens.co/docs/guides/string-review.md) page.

## Check your plants

`skill://solarsens/daily-portfolio-check/SKILL.md` uses the same procedure as its prompt and [guide](https://ai.solarsens.co/docs/guides/portfolio-check.md). It requires `MCP_SKILLS` set to `"true"` and all required tools served.

## Review alarms

`skill://solarsens/alarm-triage/SKILL.md` is available after the alarm tools are served, with `MCP_SKILLS` set to `"true"`. It uses the same procedure as its prompt and [guide](https://ai.solarsens.co/docs/guides/alarm-triage.md).

`skills/list` returns all available skills in one page, with no cursor. `skills/get` accepts each listed skill URI. Each entry gives the SHA-256 digest and UTF-8 size of the file that `resources/read` returns. Hosts without the Skills extension can read the files as resources.
