内容
# AutoRim
通过MCP实现对正在运行的RimWorld殖民地的自然语言控制。
询问你想要的——“谁应该做饭?”,“设置一个狩猎任务”,“排队研究电力”,“封锁北侧入口”——它就会在游戏中实现。
为 **RimWorld 1.6**(针对1.6.4871版本开发)而建。
https://steamcommunity.com/sharedfiles/filedetails/?id=3771536321
---
## 工作原理
RimWorld没有外部API,因此唯一能获取实时殖民地状态的方法是从游戏进程内部。AutoRim因此分为两部分:
```
Claude ──MCP/stdio──► server/ ──HTTP on 127.0.0.1──► AutoRim mod (inside RimWorld)
│
main-thread dispatcher
│
Verse / RimWorld API
```
- **`mod-src/`** — 一个C#模组(`net472`),运行一个仅限本地回路的HTTP监听器,并针对游戏自己的API执行命令。
- **`server/`** — 一个TypeScript MCP服务器,Claude与之通信,并转发到模组。
两个值得了解的设计选择:
**无Harmony。** RimWorld自动实例化在加载的模组程序集中找到的每个`GameComponent`,这提供了一个每帧的钩子,而无需修补任何内容。警报和事件被轮询而不是拦截。只有`AutoRim.dll`被加载到游戏中——即使JSON层也是手工制作的,因为向RimWorld的AppDomain加载第二个常见库的副本是众所周知的与其他模组冲突的来源。
**套接字线程从不触及游戏。** Unity和RimWorld不是线程安全的。请求被排队并在`GameComponentUpdate`中执行,在每个帧的时间预算下;套接字线程只等待一个句柄。这是设计中承载负载的部分。
---
## 安装
```powershell
# 1. 构建并安装模组
.\scripts\deploy.ps1
# 2. 构建MCP服务器
cd server
npm install
npm run build
```
然后在RimWorld中:**模组** → 启用 **AutoRim - MCP Bridge** → 在提示时重启。
在加载殖民地时验证桥接:
```powershell
.\scripts\smoke.ps1 # 基本检查
.\scripts\smoke.ps1 -Concurrency 50 # 还会对主线程调度器施加压力
```
在Claude Code中注册MCP服务器(此存储库中的`.mcp.json`已经这样做):
```json
{
"mcpServers": {
"rimworld": {
"command": "node",
"args": ["server/dist/index.js"]
}
}
}
```
> 模组的DLL在RimWorld运行时被映射到内存中,因此 **在重新部署之前请关闭游戏**。
---
## 安全性
工具所做的大部分事情都可以通过正常游戏操作逆转,并且会立即执行。任何不立即执行的操作都需经过明确的关口。
**破坏性操作需要 `confirm: true`。** 没有它,调用不会改变任何内容,并会返回一个描述将发生的操作的预览:
| 操作 | 操作内容 |
|---|---|
| `designate.slaughter` | 杀死殖民地动物 |
| `designate.deconstruct` / `uninstall` | 拆除建筑 |
| `designate.strip` | 剥夺小人的装备或尸体的物品 |
| `designate.release_animal` | 将驯化的动物释放到野外 |
| `health.add_surgery` | 不可逆转,可能导致残废或死亡 |
| `prisoners.release` / `execute` | 囚犯离开或被处决 |
| `trade.execute` | 货物和银币交换 |
| `caravan.form` | 小人离开地图 |
除此之外:
- **滚动恢复点。** 在任何确认的破坏性操作之前,模组会保存到 `AutoRim-safety`(每分钟限速一次)。只有一个存档,每次覆盖,因此始终存在一个“就在它执行操作之前”的状态可以回滚到。如果您玩的是永久死亡模式,请保持此功能开启。
- **`control.save` 不能覆盖您的存档。** 名称被强制放入 `AutoRim-` 插槽中。
- **审计日志**,位于 `…/Config/AutoRim/actions.log`,以及每次操作的游戏内消息。
- **终止开关**:选项 → 模组设置 → AutoRim,或 `control.disable_bridge` 工具。
- **仅限本地回路**,并在第一次运行时生成一个随机令牌。
---
## 工具
24种工具,约110个命令。每个工具接受一个 `action`。
| 工具 | 涵盖内容 |
|---|---|
| `rimworld_colony` | 快照、警报、信件、资源、电力 |
| `rimworld_pawns` | 列表、详细信息、重命名、区域、医疗护理、敌对反应 |
| `rimworld_work` | 工作优先级、批量分配 |
| `rimworld_jobs` | 征求、移动、攻击、优先、停止 |
| `rimworld_designate` | 狩猎、采矿、砍伐、收获、驯化、收集、禁止、宣称、平滑 + 破坏性操作 |
| `rimworld_build` | 建造、线和矩形、建造检查、可建造物 |
| `rimworld_research` | 当前、列表、设置、停止、建议 |
| `rimworld_bills` | 工作台生产订单 |
| `rimworld_zones` | 仓库和生长区域 |
| `rimworld_storage` | 优先级和过滤器 |
| `rimworld_areas` | 允许区域 |
| `rimworld_policies` | 服装、食物、药物 |
| `rimworld_schedule` | 时间表 |
| `rimworld_health` | 手术 |
| `rimworld_animals` | 训练、主人 |
| `rimworld_prisoners` | 互动模式、释放、处决 |
| `rimworld_trade` | 完整的贸易会话 |
| `rimworld_caravan` | 列表、可发送、形成 |
| `rimworld_world` | 派系、定居点、任务 |
| `rimworld_ideology` | 意识形态(Ideology DLC) |
| `rimworld_map` | 地图信息、物品搜索、ASCII区域视图 |
| `rimworld_query` | 定义查找 |
| `rimworld_analyze` | 最适合某项工作的小人、空闲小人、瓶颈、威胁 |
| `rimworld_control` | 速度、保存、通知、桥接状态 |
### 两个比其大小更有分量的工具
**`rimworld_query`** — 游戏的内部名称很少与人们的说法相符。当某物被拒绝为未找到或不明确时,错误会携带候选项;这个工具是您正确解决它们的方法。
**`rimworld_analyze best_pawn_for`** — 返回整个排名及其理由,而不是赢家。“Ivy,烹饪8,带有燃烧的热情,仅在两个其他工作上”是可以不同意的;“assign Ivy”则不然。
---
## 已知限制
- **贸易队伍离开时只带有小人携带的物品。** `caravan.form` 使用立即离开的路径。组装货物清单是游戏的多步骤加载流程,不在此范围内 — 使用游戏内的形成贸易队伍对话框进行真正的补给运行。
- **指定操作作用于当前屏幕上的地图**,因为这是RimWorld的 `Designator` 类绑定的内容。读取接受 `map` 索引;指定操作不接受。
- **仅限核心 + 意识形态 DLC。** Royalty、Biotech、Anomaly和Odyssey命令被 `ModsConfig` 限制,返回一个干净的 `DLC_NOT_ACTIVE` 而不是异常失败,但此处未测试。
- **重新部署需要关闭游戏**,因为Windows保留了加载的DLL映射。
---
## 仓库布局
```
mod-src/ C#模组源码
AutoRim/
Bridge/ HTTP监听器、JSON、主线程调度器
Core/ 命令注册、安全门、定义解析器、身份
Read/ 状态序列化器
Commands/ 每个子系统的一个文件
dist-mod/AutoRim/ 可部署的模组文件夹(About/ + Assemblies/)
server/ TypeScript MCP服务器
scripts/ deploy.ps1、smoke.ps1、rpc.ps1
```
`scripts/rpc.ps1` 发送单个命令并打印原始响应及其大小 — 在开发中很有用,因为在此约束下保持读取量小是硬约束而非事后才考虑的问题。
```powershell
.\scripts\rpc.ps1 colony.snapshot
.\scripts\rpc.ps1 analyze.best_pawn_for '{"work":"Cooking"}'
```