Skip to main content

Bob Ross 🎨

CI

"We don't make mistakes, just happy little servers."

An MCP server for managing a Canonical Landscape estate from an AI agent (Claude Desktop / Claude Code). Bob Ross wraps the Landscape API as MCP tools — inventory, alerts, activities, patching, script execution — with a safety layer built in so an LLM can't accidentally reboot your whole fleet.

Jira: BR

Why it's not just a dumb API wrapper

  • Blast-radius previewresolve_query shows how many machines a query matches (and a sample) before you act.
  • Dry-run → confirm handshake — every destructive tool returns a short-lived confirm_token on the first call; you must call again with the token to execute. If the matched machine set drifts in between, the token is rejected.
  • Secure by default — read-only mode is on out of the box. Writes need two explicit switches flipped. TLS is verified. Secrets never hit logs.
  • Full audit log — every action (dry runs, executes, denials) is appended to a redacted JSONL audit trail.
  • Dual auth — REST bearer token or legacy HMAC query API, auto-detected.

Status

MVP scaffold. Read tools + gated write tools are implemented against both API backends. Exact REST endpoint paths are set as constants in client.py and get finalized once pointed at a live instance — run the ping tool to validate.

Setup

python3.14 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
cp .env.example .env      # then fill in URL + credentials
pytest                    # run the safety/signing/config tests

Configuration

All via BOBROSS_* env vars (or .env). See .env.example. Key ones:

Var Default Meaning
BOBROSS_LANDSCAPE_URL Landscape base URL
BOBROSS_API_TOKEN REST bearer token (mode A)
BOBROSS_ACCESS_KEY / BOBROSS_SECRET_KEY Legacy HMAC keys (mode B)
BOBROSS_READ_ONLY true Blocks all writes
BOBROSS_ALLOW_WRITES false Second switch required for writes
BOBROSS_TLS_VERIFY true Verify TLS certs

Run

bob-ross            # stdio transport (Claude Desktop / Code)
# or
python -m bob_ross

Claude Code (CLI)

Install once (user scope → available in every project). The cd wrapper makes it location-independent and keeps credentials in .env (never in Claude's config):

claude mcp add bob-ross --scope user -- \
  bash -lc 'cd /path/to/bob-ross && exec ./.venv/bin/bob-ross'

Starts in read-only mode. To enable actions, flip BOBROSS_READ_ONLY=false and BOBROSS_ALLOW_WRITES=true in .env, then restart Claude Code.

Claude Desktop / Code (stdio)

{
  "mcpServers": {
    "bob-ross": {
      "command": "/path/to/bob-ross/.venv/bin/bob-ross",
      "env": { "BOBROSS_LANDSCAPE_URL": "https://landscape.example.com",
               "BOBROSS_API_TOKEN": "..." }
    }
  }
}

Tools

Read: ping, estate_health, list_computers, get_computer, resolve_query, pending_updates, list_alerts, list_activities, get_activity, wait_for_activity, list_scripts Write (gated): execute_script, reboot_computers, apply_security_upgrades, upgrade_packages, install_packages, remove_packages, add_tags, remove_tags

Activity-creating write tools accept wait=true to poll the resulting Landscape activity to a terminal status and return a completion summary (succeeded / failed / still-incomplete), so the agent knows the real outcome instead of just "queued".

Resources: landscape://computers, landscape://alerts, landscape://health, landscape://computer/{computer_id} (template) Prompts: patch_security_updates, triage_estate, reboot_reboot_required, patch_machine

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bob_ross_landscape-0.1.0.tar.gz (22.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bob_ross_landscape-0.1.0-py3-none-any.whl (20.7 kB view details)

Uploaded Python 3

File details

Details for the file bob_ross_landscape-0.1.0.tar.gz.

File metadata

  • Download URL: bob_ross_landscape-0.1.0.tar.gz
  • Upload date:
  • Size: 22.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for bob_ross_landscape-0.1.0.tar.gz
Algorithm Hash digest
SHA256 ebaecc90227aa1c80668ccc1629f7df72ac6c895b3253691195a1ed805761c95
MD5 3c1ddde35dbc58e1af992e4cdadac636
BLAKE2b-256 369ef7b3b55480cfc8477e88ad1de5637169e081f21a587486558579c6fbe968

See more details on using hashes here.

Provenance

The following attestation bundles were made for bob_ross_landscape-0.1.0.tar.gz:

Publisher: publish.yml on just-an-oldsalt/bob-ross

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bob_ross_landscape-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for bob_ross_landscape-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 70beb1f1ea77b9f44bcd7a836a905320f1a34351980e268cda55d657acbb81ea
MD5 646cfa47d5f55f86e441acb5f1a2c025
BLAKE2b-256 00b92161059371328c635e568f7ae43aed4f91f6e0b711b825560ca311676336

See more details on using hashes here.

Provenance

The following attestation bundles were made for bob_ross_landscape-0.1.0-py3-none-any.whl:

Publisher: publish.yml on just-an-oldsalt/bob-ross

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page