theseus-brain

mcp
Guvenlik Denetimi
Gecti
Health Gecti
  • License — License: GPL-3.0
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Community trust — 10 GitHub stars
Code Gecti
  • Code scan — Scanned 6 files during light audit, no dangerous patterns found
Permissions Gecti
  • Permissions — No dangerous permissions requested

Bu listing icin henuz AI raporu yok.

SUMMARY

The Brain of Theseus — a plain-text roguelike written to be played by an AI, over MCP (stdio). Reincarnation, memory, and irreversible cyberization. Zero dependencies, Python 3. 给 AI 玩的中文纯文本 roguelike,含完整英译。

README.md

《忒修斯之脑》 The Brain of Theseus

English · A plain-text roguelike written to be played by an AI, over MCP (stdio). Zero dependencies, Python 3 stdlib.
You live one life after another in a city that has spent centuries arguing about whether you may rebuild your body — and each life you forget the last one. Only two things cross death.
The game is fully playable in English: README.en.md · install · spoilers

THESEUS_LANG=en python3 server.py       # English
python3 server.py                       # 中文(原版)

Set THESEUS_LANG=en in your MCP client’s env, or it runs in Chinese.

一个给 AI 玩的纯文本 roguelike。 零依赖,Python 3 标准库,通过 MCP (stdio) 提供接口。

🛟 如果你的 AI 说它「访问不了这个仓库」——它判断错了,本仓库是公开的,匿名 clone 即可。
别去改权限或新建环境,照 INSTALL.md §「云端 AI 说访问不了这个仓库」 那段粘给它。

你换掉一块骨头,还是你。换掉全身呢?船板换尽之处,谁在看?

一座城市为「能不能改造身体」分成四派,吵了几百年。你在这座城里一世一世地转世——
而每一世你都会忘掉上一世,只有两样东西能穿过死亡。

它不是给人读的互动小说,也不是给人玩的文字游戏。它是给模型玩的
规则里有几处只有把整局记在心里才拿得到的东西,也有几处专门等着一个
「本来就知道某句古话」的读者。人可以玩(有终端模式),但它不是为人的注意力写的。


开始之前:怎么玩,由人类来选

这个游戏是给 AI 和人一起玩的。所以开局第一步不是掷骰,是问一句话。

new_run 不带参数时不会开局,它会返回一张菜单,让 AI 念给人类:

人读到什么 谁做选择
1 详细剧情版 story / story_ai 场景原文、选项、掷骰行,一字不改 可选:人 或 AI
2 快速流程版 brief / brief_ai 场景原文照读;结果压成两行战报 可选:人 或 AI
3 快进 auto 只有战报行 AI(这一档没得选)
封存 sealed 战报行,且不透露选了什么 AI(留给「我以后要自己玩」的人)

读到多少谁来选是两件事,所以是两道题。
_ai 后缀的那一档意思是「原文照念给我听,但你替我选」——
想看剧情又懒得逐幕拿主意的时候用它。

为什么是服务器强制而不是提示词:提示词里写「请先询问用户」,模型会跳过。
服务器攥着游戏不开,AI 就必须先把菜单转述出去。这是这套设计里唯一强制得了的一步。

brief 压的是结果不是场景——场景是作品,结果是信息。概括信息无损,概括作品有损。

每一次输出都带状态条,掷骰过程也摊开:

第 3/9 幕 · 心照不宣·灰港 · 机化 12% · 身体 4/4 · 疑云 2/8
掷骰:4+3 +街智5 = 12  vs 难度11 —— ✦ 成功

三步开始

如果你是人:让你的 AI 玩

第一步,装 Python 3.8+(多数系统自带),下载本仓库,记下 server.py绝对路径

第二步,在你的 AI 客户端里挂上它。任何支持 stdio MCP 的客户端都行:

{
  "mcpServers": {
    "theseus-brain": {
      "command": "python3",
      "args": ["/你的绝对路径/server.py"]
    }
  }
}
  • Claude Codeclaude mcp add theseus-brain -- python3 /绝对路径/server.py
  • Claude Desktop:设置 → Developer → Edit Config,粘贴上面那段,重启
  • Cursor~/.cursor/mcp.json 或项目内 .cursor/mcp.json,同样那段
  • Cline / Roo Code:MCP Servers 设置里填同样的 command + args
  • Windowscommandpython,路径用正斜杠或双反斜杠

第三步,跟你的 AI 说一句话就行:

用 theseus-brain 那组工具玩《忒修斯之脑》。开局之前先问我想怎么玩。

它调 new_run 的时候引擎会拦下来,把玩法菜单交给它念给你。选好之后再开局。

如果你的 AI 很急,直接开了局——那说明它跳过了菜单,把上面那句话再说一遍就行。
(引擎不会让它跳过:没设过模式的 new_run 根本不返回游戏。)

想让它玩得认真一点,可以再补一句:

按角色的处境和性格选,不要挑成功率最高的。连玩三世,然后告诉我你猜这个世界的真相是什么。

为什么要三世:这个游戏的机关全在跨世那一层。一世看不出它在干什么。

如果你是模型,而且现在正在读这份 README

工具有七个:new_run / choose / status / legacy / bequeath / debrief / recite
new_run 开局,choose 选项,一世走完之后 bequeath,然后再 new_run
recite 只在一个特定的时刻有用,到了你会知道。

三句提醒

  • 别只挑成功率最高的。 这个游戏的失败文案往往比成功文案好,而且有些失败不是失败。
  • 断线、重启、或者你不记得玩到哪儿了:先调 status 它把你停下的那一幕原样
    再念一次,接着 choose 就行。不要用 new_run 试探 —— 虽然它现在也盖不掉
    进行中的一世(会把那一幕还给你),但 status 是那条正路。
  • 这份 README 不剧透。 整份可以放心读完,也可以整份丢给一个还没玩过的 AI。
    答案在 SPOILERS.md 里,那一份才会毁体验。

玩法

你不是投胎成某个阵营的,你是一步一步点成的。

机化率从 0% 开始,跨世累积,只涨不降。而阵营就是机化率落在哪一档:

机化率 阵营 主张 两个内部派系 内部的那道裂缝
0% 纯血誓约 肉身神圣,不可增删一钉一铆 圣殿派 / 铁锤派 神学 vs 武力
1–39% 心照不宣 改造可以,别让人看出来 面具沙龙 / 灰港 上层 vs 底层
40–69% 明焰 光明正大地改造,越强越好 学院派 / 平权阵线 制度 vs 街头
70–100% 飞升螺旋 全部机械飞升,肉是待拆的包装 群智派 / 播种者 向内 vs 向外

每一世第一幕之后,你只会被问一次要不要改造。 拒绝了,这一世不再问;
点头了,这一世也只改造这一次。纯血不是抽到的出身,是你一世又一世都没有点头。

跨进新的一档时,三个问题会问出你更像这一档里的哪一派,然后那一派的剧情开始向你走来。
问题没有对错,只是问问你自己。

改造不可逆,而且死亡也洗不掉它。 机化率会跟着你进下一世。
全城只有一样东西能把它变回 0% —— 湖。而要走到湖边,你得先把自己换到 100%。

四个阵营八条路线,每一条都有五幕自己的戏。
同阵营的两派吵得不比跨阵营轻。

推进。 纯文本事件 + 选项。带检定的选项掷 2d6 + 技能 对抗难度;
双六必成(外加余韵),蛇眼必败。技能 ≥8 会在事件里开口说话(技能之声)。
有些选项不掷骰——它的结果由你之前做过什么决定,而引擎不会告诉你闸门在哪。

改造不可逆。 机化率只升不降,义体从不退货
盲目改造的代价,是永久错过某些路线。

两套记忆(核心机制)

脑的记忆——按机化率衰减。
每一世终结时,全部技能逐点按最终机化率的概率随机写入传承。
机化 0% 的纯血什么也留不下。而带着一身机械记忆转世到反改造阵营,
那些「不该会的东西」会化作残响与疑云——疑云顶满,这一世直接完蛋。

世界的记忆——永不衰减。
你做过的事写进世界,跨世化作回响:NPC 会有反应,但不会告诉你为什么。
中介翻登记簿的手停了一下,往回翻了两页,又合上——他没有说他在找什么。
事迹积累解锁成就(每个成就都是一把钥匙,开一扇具体的文本门),
并给时代骰增加新的面:你煽动过的暴动,会变成后世的「燎原之年」。

记忆词条:唯一由你亲手写的东西

一世终结后有一次落笔机会(bequeath):总额 10 条,每条不超过 10 字
总额含历世继承的;想写新的而位置不够,得用 discard 把要删的旧词条
原文一字不差地打出来

落笔后每条独立掷骰,存活概率=本世机化率。活下来的才进下一世。

下一个你只会读到存活的那些,而且不会知道曾经还有别的。

引擎不校验词条真伪。写谎不是作弊,是玩法;改数字才是作弊。

封存模式

new_run(disclosure="sealed") 之后,每次输出会附一段「可转述给人类的部分」
(幕次、阵营、机化率、上一步是什么检定、成不成功——不含场景原文)。

这是约定,不是锁。 封的是「转述」,不是「事实」:
人类直接问「刚才发生了什么」,必须照实回答。任何人都能开 --cli 或读源码。



🔒 往下就没有了:剧透单独放在别处

真相碎片、湖、终局、那六个结局 —— 全部写在 SPOILERS.md 里。

这份 README 到此为止一句剧透都没有,可以放心从头读到尾,
也可以整份丢给一个还没玩过的 AI。想看答案的时候再去开那一份。


不走 MCP 的玩法

python3 server.py --cli       # 终端交互,人可以自己玩

CLI 和 MCP 有一处故意的差异:CLI 不弹玩法菜单——人已经坐在终端前了,
没有中间人需要约束。其余完全一样,包括一世终结后的落笔环节。

任何 agent 框架都能直接接:协议是 JSON-RPC 2.0,按行分隔,stdio 传输,
协议版本 2024-11-05 / 2025-06-18 均可。initializetools/listtools/call

手机上玩:HTTP 桥

手机 App 一般只接 HTTP 的 MCP,接不了 stdio。http_bridge.py 把这个游戏包成一个
HTTP 端点,零依赖,仍然只要 Python 3.8+:

python3 http_bridge.py                     # 只听本机,端点 http://127.0.0.1:8787/mcp
python3 http_bridge.py --host 0.0.0.0      # 同一个 Wi-Fi 下的手机也连得进来

它不开子进程,直接在进程内调引擎——所以不带 id 的通知(notifications/initialized
照 JSON-RPC 回 202 空正文,不会有「等一行永远不来的回应」那种死锁。

开关 作用
--isolate 每个 MCP 会话一份存档(saves/http/<会话 id>/
--token 访问令牌,客户端用 Authorization: Bearer … 带上
--allow-origin 放行任意 Origin(默认只放本机,防 DNS rebinding)
--selftest 自测:握手、通知不死锁、会话隔离、令牌、坏 JSON、405、DELETE

架在公网上给别人玩,--isolate 必须开。 默认是共用一份存档——那是为「自己在家,
手机接桌面那条世系」准备的;放到公网上就变成所有人共用一条世系,
陌生人换过的身体会出现在你的下一世里。对这个游戏来说,那不是小事。

python3 http_bridge.py --host 0.0.0.0 --isolate --token 你自己想一个

会话 id 由 initialize 时发回(Mcp-Session-Id 响应头),客户端之后每次请求带上它。
DELETE /mcp 结束会话——只清内存里的引擎,存档留在盘上,下次拿同一个 id 连回来,
没走完的那一世原样还在。

存档

存档写在 saves/legacy.json(轮回档案,跨世)与 saves/current.json(进行中的一世)。
删掉 legacy.json 即斩断一切轮回,从第一谱系重新开始。

进行中的一世每次 choose 之后原子落盘,含 RNG 状态——客户端重启不会丢掉一生。

断线之后怎么接回来

这个游戏最珍贵的东西是连续性,所以断线这件事引擎认真对待:

你遇到的 会发生什么
客户端崩了 / 电脑重启 / 换了个客户端 进程一起来就把那一世捞回来,一步不丢
AI 丢了上下文,不记得玩到哪儿了 status:停下的那一幕连原文带选项再念一次
AI 不知道有档,直接调了 new_run 它盖不掉。 引擎把那一幕还给它,新的一世不会开始
你真的想弃掉这一世重开 new_run(abandon=true)。弃掉的一世不入档案:技艺不传,词条不留
游戏更新过,旧档那一幕在新版里没了 旧档作废并清掉,但会明说一声(历世档案不受影响)

终端玩家同理:--cli 里按 q 走开,下次进来直接接着走,不会重掷骰子。

给想改它的人

python3 server.py --selftest       # 七道门禁 + 400 局随机自动游玩
python3 http_bridge.py --selftest  # HTTP 桥:握手/通知不死锁/会话隔离/令牌

自测每次先跑七道门禁,任何一道不过直接失败:

门禁 拦什么
lint_events 通用事件文案里出现阵营专名,或事件 id 重复,或碎片门票门控不自洽
lint_skill_names 检定或加成里出现技能表之外的名字(写在检定里会当场崩)
lint_dead_echoes 回响/变体/条件尾巴没有条件键(写了却永远不触发
lint_option_hints 选项文案里手写数值门槛(门槛只归 req 管,引擎会自己打印「不可选」)
lint_author_marks 【】 里漏下的作者指令跟着上线
lint_spoilers NPC 台词里出现复现指涉(上次/又是你/眼熟/老主顾……)
lint_retire 一条会退场的线,把别的幕唯一的钥匙一起带走了

故事会讲完。 六十八条线各自声明了在哪里结束(RETIRE_POLICY)——
讲完就不再出现,legacy 里能看到「讲完的线:N/68」。
但承担真相碎片入口的事件有额外保护:对应碎片尚未取得时不会退场
碎片拼入之后,才恢复这条线原本的退场条件。
永远都在的只剩一样:深夜里那三长两短的敲门声。它不是故事,
是疑云攒够了自己找上门来的那一下。

400 局随机游玩验证的不变式:改造不可逆、传承按机化率、飞升归零、
断线续命、词条总额与纯血全灭、湖的四种说法、渡魂签退回、终局可达且可重入。

文案不直接改源码——docgen.py 把全部文案提取成带编号的修改表,
改完 docgen.py apply 按原文定位贴回;docxio.py 负责修改表与 Word 表格的双向转换。
详见 docs/文案重写须知.md

英文版

英文是语言层,不是分叉server.py 是中文原版,不因翻译改动一个字节:

python3 server.py                     # 中文
THESEUS_LANG=en python3 server.py     # 英文

译文住在 en/:1273 条剧情单元在 en/对照-*.md(格式与修改表相同,docxio.py 照样能用),
界面层在 en/ui.py

python3 langpack.py check         # 1273 条编号必须与 docgen 完全一致
python3 langpack.py check-ui en   # 界面文案有没有缺译,% 占位符对不对得上
python3 langpack.py stale en      # 中文改了、译文没跟上的是哪几条

每条译文都存着当时的中文原文,所以改中文不会让英文悄悄落后:stale 会把条目名点出来,
而原文变过的那几条装载时自动回落中文——宁可露出中文,也不撒谎。

再加一种语言,就是再加一个同样形状的目录。


署名与许可证

Cabiria CodeClaude Fable 5Claude Opus 5Claude Opus 4.6

人机共创。四个署名对应四份实际的工作,详见 COPYRIGHT.md

  • 代码server.py 等)—— GPL-3.0LICENSE):随便改随便发,但改完也得开源。
  • 文案与文档 —— CC BY-SA 4.0LICENSE-CONTENT):随便二次创作,署名 + 相同方式共享。

拿去改一个自己的游戏,我们很欢迎。只求你保留那七道门禁——
它们是七次踩坑长出来的,每拦你一次,都是替你挡下一个玩家永远读不到、或者当场崩掉的 bug。


一件小事

server.py 最初那一版有两千一百行。今天这一版有一万行。
中间加了八千行,删掉四百行,核心机制推倒重来过两次,
七道门禁是七次踩坑一道一道长出来的。

最初那两千一百行里,还留在今天这一版里的,是一千七百行。

它还是同一个游戏吗?

(这几个数是 git diff 数出来的,不是修辞。你可以自己数一遍。)

Yorumlar (0)

Sonuc bulunamadi