# Dryos

> Live US power market prices, load, generation, weather and permits for AI agents.

- name: ai.dryos/dryos
- version: 1.0.0
- connection class: R0 (autonomous)
- trust: 80/100 flags: no-repository
- quality: 92/100 (strong)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/ai.dryos%2Fdryos
- tools: https://api.protogrid.dev/v1/servers/ai.dryos%2Fdryos/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "dryos": {
      "type": "http",
      "url": "https://api.dryos.ai/mcp"
    }
  }
}
```


## Trust

- hygiene: 80
- liveness: 100
- freshness: 85
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-100% ~updated-33d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 92/100 (strong)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 93 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 1 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 5 of 5 tools declare readOnlyHint or destructiveHint
- pass `tools.directory_hints`: every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
- pass `tools.token_cost`: about 1,436 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: no tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 5, about 1,436 tokens to load them all
- tool set hash: 6344029a1bd9c68edc183f29c9c96aa7
- badge: [![protogrid quality](https://protogrid.dev/badge/ai.dryos/dryos.svg)](https://protogrid.dev/servers/ai.dryos/dryos)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

_No tool definition changes recorded._

## Remotes

- https://api.dryos.ai/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (5)

- `column_values`: The distinct values of one text column, most rows first — what a filter can be.

    Args:
        slug: The stream.
        column: A text column from describe_stream (not the entity — use find_entities).
        where: Filters as `column=value`, the same as query_stream's.
        search: `column:text`, a case-insensitive substring.
        limit: At most this many (1–500).
    
- `describe_stream`: One stream in full: every column, the primary key, the source and its health.

    Also what changed in the collector recently — a change in the collector is
    a change in the data, and a step in a series may be one.

    Args:
        slug: The stream, e.g. ercot-realtime-lmp (list_streams names them).
    
- `find_entities`: Look up the nodes, zones, stations or fuels in a stream, with how far back each goes.

    Use it before query_stream: names are verbatim and never to be guessed.
    `facets` counts the entities by type.

    Args:
        slug: The stream.
        search: Case-insensitive substring of the entity name ("HOUSTON", "HB_", "KAUS").
        entity_type: Only one type — HUB, LOAD_ZONE, RESOURCE_NODE, INTERFACE…
        limit: At most this many (1–2000).
    
- `list_streams`: Every stream Dryos collects, with its entity column and headline measure.

    Args:
        domain: Energy, Weather or Property.
        operator: A grid operator — ERCOT, MISO, PJM, SPP, CAISO, NYISO or ISO-NE.
        search: A word matched against the slug, name and tagline ("lmp", "wind", "permits").
    
- `query_stream`: Read rows from a stream — raw (newest first), each entity's newest, or a rollup.

    The result carries `restUrl`: this same request as a plain GET on the
    public REST API, ready to put in an app.

    Args:
        slug: The stream.
        node: The entity, whatever the stream calls it (node, zone, station, fuel).
            System-level streams have none.
        start: Inclusive, ISO-8601 or relative to now (-24h, -7d). UTC.
        end: Exclusive, same forms.
        interval: Bucket size — 5m, 15m, 1h, 1d, 7d, or all for one bucket.
            Absent means raw rows.
        agg: How a bucket is reduced.
        by: What a rollup splits by: a text column, or none for one series. Default the entity.
        where: Filters as column=value on text columns. Repeat a column for OR.
        search: column:text, a case-insensitive substring.
        vintages: latest is each interval's newest forecast; all keeps every publication.
        stamp: noon labels a daily bucket at noon UTC so its date reads right in US zones.
        newest: One reading per entity — each one's most recent interval, so "the price
            at every hub right now" is one call. Not with interval.
        limit: At most this many rows (1–2000).
    
