brs-docs-mcp
by bblietz
README.md
# brs-docs-mcp
MCP server for Roku BrightScript documentation plus device-control tools.
See `CLAUDE.md` for dev conventions and `docs/superpowers/specs/2026-04-16-brs-docs-mcp-design.md` for the design.
## Tools
### Documentation (SQLite FTS5)
- `brs_search(query, limit, kind?)` full-text search across BrightScript docs.
- `brs_get(id)` fetch a doc by id (e.g. `component:roDateTime`).
- `brs_list(kind, prefix?)` list docs of a given kind, optional title prefix filter.
### Read-only device introspection (ECP, port 8060)
- `roku_device_info(host?)` parse `/query/device-info`.
- `roku_list_apps(host?)` parse `/query/apps`.
- `roku_tail_log(host?, seconds=10)` capture BrightScript debug console output for `seconds`.
- `roku_query_active_app(host?)` parse `/query/active-app`.
- `roku_query_media_player(host?)` parse `/query/media-player` to a flat snake_case dict.
- `roku_query_r2d2_bitrate(host?)` parse `/query/r2d2_bitrate` into a list of stream entries.
- `roku_query_icon(app_id, host?)` fetch the channel icon at `/query/icon/<app_id>`; returns mime, base64 body, byte count.
### ECP control (port 8060, no auth)
- `roku_keypress(key, repeat=1, mode="press", host?)` send `/keypress`, `/keydown`, or `/keyup`. Allowlisted standard keys (`Home`, `Up`, `Down`, ...) plus `Lit_<char>` for character input.
- `roku_keysequence(keys, delay_ms=150, host?)` send a sequence of keypresses with `delay_ms` between each.
- `roku_launch(app_id, params?, host?)` POST `/launch/<app_id>` with optional URL-encoded deep-link params. `app_id="dev"` is allowed.
- `roku_input(params, host?)` POST `/input?<urlencoded>` to deep-link into the running channel.
- `roku_to_home(host?)` macro that sends `Home, Home` to drop the device into a known idle state. NOT a reboot; the return value documents this.
### Authenticated dev-portal (port 80, Digest)
- `roku_install(zip_base64, host?, password?)` sideload a channel zip.
- `roku_remove(host?, password?)` remove the currently installed dev channel.
- `roku_query_registry(dev_id, host?, password?)` parse `/query/registry/<dev_id>`.
- `roku_profiler_snapshot(host?, password?)` POST `/plugin_inspect` with `mysubmit=Inspect`; extract whatever blocks are present plus a 10 KB raw HTML excerpt.
- `roku_crashlog_pull(host?, password?)` GET `/plugin_factory_log`. Returns `ok=False` on 404. Body is streamed and capped at 1 MB.
`host` falls back to `BRS_DEFAULT_ROKU_HOST`. `password` falls back to `BRS_ROKU_DEV_PASSWORD`.
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessSyncing