内容
# 鲍勃·罗斯 🎨
[](https://pypi.org/project/bob-ross-landscape/)
[](https://github.com/just-an-oldsalt/bob-ross/actions/workflows/ci.yml)
[](LICENSE)
> *"我们不犯错误,只是拥有快乐的小服务器。"*
一个用于从AI代理(Claude Code / Desktop)管理**Canonical Landscape**的MCP服务器。鲍勃·罗斯将Landscape API封装为平静、友好的MCP工具——库存、警报、活动、补丁、脚本执行、重启——并**内置安全层**,让您的代理可以管理整个机队的快乐小服务器,而无需对错误服务器进行激烈操作。
每个人都需要一个朋友。即使是您的Ubuntu机队。
---
## 🖌️ 为什么它不仅仅是一个普通的API封装
空白的画布是一件美丽的事物——一支仍然存在的机队也是如此。鲍勃·罗斯谨慎地绘制:
- **爆炸半径预览** - 在您触摸任何东西之前,`resolve_query`会退一步,显示查询匹配的机器数量(和样本)。始终知道画布的大小。
- **预运行 → 确认握手** - 每个破坏性工具在第一次调用时返回一个短期的`confirm_token`。您必须再次调用并带有令牌才能实际执行。如果匹配的机器集在中间漂移,则令牌将被拒绝。不会有快乐的小意外重启500台机器。
- **默认安全** - 只读模式**默认开启**(我们都从干净的画布开始)。写入需要**两个**开关故意打开。TLS已验证。机密永远不会触及日志。
- **完整审计日志** - 每一个笔触(预运行、执行、拒绝)都被追加到一个编辑过的JSONL轨迹中。您可以随时查看画笔的操作。
- **活动感知** - 在Landscape中写入操作会在稍后异步运行。传递`wait=true`,鲍勃·罗斯会监视油漆干燥,然后告诉您成功/失败/仍在进行中 - 不仅仅是“已排队”。
- **双重身份验证** - 传统HMAC查询API *或* REST承载令牌,自动检测。
---
## 🎨 取出颜料(安装)
从PyPI - 一条命令即可获得整个工作室:
```bash
pip install bob-ross-landscape
```
这为您提供了`bob-ross`命令(导入包为`bob_ross`)。
<details>
<summary>或从源代码安装(用于开发)</summary>
```bash
git clone https://github.com/just-an-oldsalt/bob-ross
cd bob-ross
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest # 单元测试(安全/签名/配置/健康/...)
python scripts/smoke.py # 安全的实时烟雾测试与您的实例(只读,无写入)
```
</details>
---
## 🖼️ 设置您的调色板(配置)
所有内容都是`BOBROSS_*`环境变量(或`.env`文件 - 参见`.env.example`):
| 变量 | 默认值 | 含义 |
|---|---|---|
| `BOBROSS_LANDSCAPE_URL` | — | Landscape基本URL(无尾随`/api/`) |
| `BOBROSS_ACCESS_KEY` / `BOBROSS_SECRET_KEY` | — | 传统HMAC密钥(模式A) |
| `BOBROSS_API_TOKEN` | — | REST承载令牌(模式B) |
| `BOBROSS_READ_ONLY` | `true` | 阻止所有写入 - 安全的空白画布 |
| `BOBROSS_ALLOW_WRITES` | `false` | 启用写入所需的**第二个**开关 |
| `BOBROSS_TLS_VERIFY` | `true` | 验证TLS证书(仅在开发自签名时设置为`false`) |
> 要让鲍勃·罗斯拿起画笔,请同时设置**两个** `BOBROSS_READ_ONLY=false` **和** `BOBROSS_ALLOW_WRITES=true`。即使这样,每个破坏性操作仍然需要预运行 → 确认握手。腰带和吊带。快乐和安全。
---
## 🪄 添加到Claude Code
```bash
pip install bob-ross-landscape
claude mcp add bob-ross --scope user \
--env BOBROSS_LANDSCAPE_URL=https://landscape.example.com \
--env BOBROSS_ACCESS_KEY=YOUR_KEY \
--env BOBROSS_SECRET_KEY=YOUR_SECRET \
-- bob-ross
```
更喜欢将机密保留在Claude的配置之外?将它们放在`.env`文件中,然后从该目录运行:
```bash
claude mcp add bob-ross --scope user -- \
bash -lc 'cd /path/to/your/bobross-env && exec bob-ross'
```
### Claude Desktop(stdio)
```json
{
"mcpServers": {
"bob-ross": {
"command": "bob-ross",
"env": {
"BOBROSS_LANDSCAPE_URL": "https://landscape.example.com",
"BOBROSS_ACCESS_KEY": "YOUR_KEY",
"BOBROSS_SECRET_KEY": "YOUR_SECRET"
}
}
}
}
```
鲍勃·罗斯总是以只读模式启动。先从那里开始。变得舒适。然后,当你准备好了,让我们开始吧。
---
## 🌲 笔刷(工具)
**读取**(始终安全 - 可以随意查看):
`ping` · `estate_health` · `list_computers` · `get_computer` · `resolve_query` ·
`pending_updates` · `list_alerts` · `list_activities` · `get_activity` ·
`wait_for_activity` · `list_scripts`
**写入**(需要权限 - 每次预运行 → 确认):
`execute_script` · `reboot_computers` · `apply_security_upgrades` ·
`upgrade_packages` · `install_packages` · `remove_packages` · `add_tags` ·
`remove_tags`
> 创建活动的写入工具采用`wait=true`来轮询生成的Landscape活动,直到达到终端状态,并返回`completion`摘要(成功/失败/仍未完成)- 以便您的代理知道实际结果,而不仅仅是“已排队”。
**资源:** `landscape://computers` · `landscape://alerts` ·
`landscape://health` · `landscape://computer/{computer_id}`(模板)
**提示:** `patch_security_updates` · `triage_estate` ·
`reboot_reboot_required` · `patch_machine`
---
## 🏔️ 快乐的小工作流
您在这里拥有无限的权力。一步一步地移动山脉:
```
您: “我的机队需要我关注什么?”
→ estate_health → “kaylee-mc: 138个待处理升级,3台机器需要重启”
您: “在kaylee-mc上修补实际上会改变什么?”
→ pending_updates title:kaylee-mc → 每个软件包的列表
您: “应用安全升级”
→ apply_security_upgrades → 预运行显示爆炸半径 + confirm_token
→ (您批准) → 使用令牌 + wait=true重新运行
→ 完成:成功 ✅ 没有失败的补丁,只有快乐的小服务器
```
---
## 📦 发布和链接
- **PyPI:** https://pypi.org/project/bob-ross-landscape/
- **发布:** 标签`vX.Y.Z`,`gh release create` → GitHub Actions通过OIDC发布到PyPI(无需令牌)。参见 [`PUBLISHING.md`](PUBLISHING.md)。
- **MCP注册表清单:** [`server.json`](server.json)
---
<div align="center">
*"天赋是一种追求的兴趣。任何你愿意练习的事情,你都可以做到。*
现在去照顾那些快乐的小服务器吧。 🎨
</div>