Bob Ross 🎨 — an MCP server for managing a Canonical Landscape estate. Happy little servers, no failed patches.
Project description
Bob Ross 🎨
"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 preview —
resolve_queryshows how many machines a query matches (and a sample) before you act. - Dry-run → confirm handshake — every destructive tool returns a short-lived
confirm_tokenon 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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ebaecc90227aa1c80668ccc1629f7df72ac6c895b3253691195a1ed805761c95
|
|
| MD5 |
3c1ddde35dbc58e1af992e4cdadac636
|
|
| BLAKE2b-256 |
369ef7b3b55480cfc8477e88ad1de5637169e081f21a587486558579c6fbe968
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bob_ross_landscape-0.1.0.tar.gz -
Subject digest:
ebaecc90227aa1c80668ccc1629f7df72ac6c895b3253691195a1ed805761c95 - Sigstore transparency entry: 2074669340
- Sigstore integration time:
-
Permalink:
just-an-oldsalt/bob-ross@b1963598e10c6cf61fe846f2bc124bee500af41a -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/just-an-oldsalt
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b1963598e10c6cf61fe846f2bc124bee500af41a -
Trigger Event:
release
-
Statement type:
File details
Details for the file bob_ross_landscape-0.1.0-py3-none-any.whl.
File metadata
- Download URL: bob_ross_landscape-0.1.0-py3-none-any.whl
- Upload date:
- Size: 20.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
70beb1f1ea77b9f44bcd7a836a905320f1a34351980e268cda55d657acbb81ea
|
|
| MD5 |
646cfa47d5f55f86e441acb5f1a2c025
|
|
| BLAKE2b-256 |
00b92161059371328c635e568f7ae43aed4f91f6e0b711b825560ca311676336
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bob_ross_landscape-0.1.0-py3-none-any.whl -
Subject digest:
70beb1f1ea77b9f44bcd7a836a905320f1a34351980e268cda55d657acbb81ea - Sigstore transparency entry: 2074669490
- Sigstore integration time:
-
Permalink:
just-an-oldsalt/bob-ross@b1963598e10c6cf61fe846f2bc124bee500af41a -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/just-an-oldsalt
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b1963598e10c6cf61fe846f2bc124bee500af41a -
Trigger Event:
release
-
Statement type: