Are you the author? Sign in to claim
MCP server for D&D campaigns, rules, memory, scenes, modules, and combat.
平台总览 · D&D runtime · D&D Skills
SagaSmithAI 的 D&D 5e Agent 能力服务。 它通过标准 stdio MCP 将 SagaSmith Core、D&D 规则运行时、D&D Skills 和模组生成 Skill 组合成一个可被不同 Agent Host 复用的服务端边界。
与“把 70+ 个工具一次性塞给模型”不同,本服务在 MCP 侧维护会话级 exposure:先发现能力组,再按当前 lobby / play / combat 阶段加载少量工具,并在阶段、权限或 TTL 改变时收回。
tools/list 只有 12 个核心发现/诊断工具,而不是整个领域 schema。exposure_call 指定名称也会被拒绝;权限不是提示词约定。flowchart TB
H[MCP Host / Agent] --> C[12 core tools]
C --> O[exposure_open]
O --> S[search → inspect → load]
S --> L[lobby groups]
S --> P[play groups]
S --> B[combat groups]
L --> R[D&D runtime + Core]
P --> R
B --> R
R --> D[(MCP-owned state)]
默认状态目录:
<workspace>/.sagasmith-dnd-mcp/
data/ttrpgbase.db # campaign, rules, FTS, branches, knowledge
data/chroma_db/ # optional dense retrieval
artifacts/modules/ # editable generated modules before import
artifacts/rulebooks/ # content-addressed staged user books
artifacts/normalized-rulebooks/ # verified normalization/OCR caches
客户端不应直接写 SQLite、ChromaDB 或 artifact 目录。所有写入通过 MCP,确保迁移、revision、幂等、权限与 audit receipt 使用同一过程边界。
Python 3.11+:
pip install -e ".[dev]"
sagasmith-dnd-mcp
若要连接 D&D Workbench UI,同时安装并启动 HTTP/SSE adapter:
pip install -e ".[gateway,dev]"
sagasmith-dnd-gateway
Gateway 默认只监听 127.0.0.1:8766。读请求按 X-SagaSmith-Principal 投影;战斗移动写请求不会直写数据库,而是调用同一服务实现中的 combat_movement MCP 工具,因此仍经过 actor 权限、campaign/branch revision、幂等、五尺格、阻挡与反应窗口校验。SSE 只发布 revision 变化通知,客户端随后重新读取 audience-filtered DTO。
启用向量嵌入:
pip install -e ".[dense,dev]"
$env:SAGASMITH_DND_MCP_DENSE_ENABLED = "1"
sagasmith-dnd-mcp
NanoBot 示例;其他 stdio MCP Host 使用相同的 command、cwd 与 env:
{
"tools": {
"mcpServers": {
"sagasmith_dnd": {
"command": "C:\\path\\to\\SagaSmith-dnd-mcp\\.venv\\Scripts\\sagasmith-dnd-mcp.exe",
"args": [],
"cwd": "C:\\path\\to\\SagaSmith-dnd-mcp",
"env": {
"SAGASMITH_DND_MCP_HOME": "C:\\path\\to\\workspace\\.sagasmith-dnd-mcp",
"SAGASMITH_DND_SKILLS_DIR": "C:\\path\\to\\SagaSmith-dnd-skills",
"SAGASMITH_DND_MCP_RULE_IMPORT_ROOTS": "C:\\path\\to\\DnD-Books",
"SAGASMITH_DND_MCP_RULE_OCR": "1",
"SAGASMITH_DND_MCP_RULE_OCR_SCALE": "2.0"
},
"toolTimeout": 900,
"injectPrincipal": true,
"enabledTools": [
"exposure_open",
"exposure_status",
"exposure_search",
"exposure_inspect",
"exposure_load",
"exposure_unload",
"exposure_call",
"server_capabilities",
"server_tool_profiles",
"storage_status",
"campaign_query",
"game_phase"
]
}
}
}
}
injectPrincipal 应在多人渠道中开启。Host 注入的 principal 是认证身份,模型不能自行声明;grant 工具中的目标 principal 与调用者身份是两个字段。
1. exposure_open(campaign_id?, principal_id injected)
2. exposure_search("create a 2024 character")
3. exposure_inspect("lobby.characters")
4. exposure_load(["lobby.characters"])
5. 重新 tools/list,原生调用新出现的工具
6. exposure_unload(...) 或等待阶段/TTL 自动收回
支持动态工具列表的 Host 使用原生 tools/list + tools/call;不能刷新 schema 的 Host 可使用 exposure_call fallback。两条路径都经过同一个服务端 exposure 与权限检查。
| 阶段 | 组 | 用途 |
|---|---|---|
| lobby | bootstrap, campaign, characters | 建团、成员/分支/Snapshot、车卡和初始资源 |
| lobby | rules, modules, memory | 规则书/规则包、模组、长期记忆与 actor knowledge |
| lobby | storage_admin | 本地 schema 管理;只允许显式 local admin |
| play | scene, characters, resolution | 场景推进、非战斗状态、检定与开战 |
| combat | observe, turn, actions | 可见战斗状态、回合、攻击/法术/反应/移动 |
| combat | save, map | 战斗中分支 Snapshot 与临时地图更新 |
每个组声明 risk、角色要求、是否需要 campaign、是否仅限本地。server_tool_profiles 返回机器可读目录,客户端不需要复制这张表。
服务提供 campaign/membership、角色控制、事件、Snapshot DAG、branch checkout、continuity context、修订式记忆以及 PC/NPC 独立的 actor knowledge。玩家只能读取当前分支、允许的场景 scope、自己控制角色的完整 sheet,以及角色真正知道的事实。
Snapshot 是可独立恢复的全量 checkpoint,recap 才是父子节点差量。切换 branch 前当前工作区必须已经保存;否则服务拒绝 checkout,避免角色状态与 actor knowledge 落在不同时间点。
用户规则书的完整路径是:
discover an allowlisted file
→ staged content-addressed artifact
→ shared document parse + quality/OCR report
→ explicit warning acknowledgement
→ indexed source
→ source-scoped search + review-only candidates
→ inactive source-bound rule pack
→ schema/mechanic validation
→ install
→ DM pins exact version to campaign
公开入口是 rule_import facade:discover → stage → inspect → ingest
→ extract_candidates → review → compile → install → activate。检查结果只要有
warning,ingest 就必须由 DM 显式传入 acknowledge_warnings=true。检索时传入精确
source_ids,防止同名章节或不同版本扩展混入证据。PDF 文本层使用 PDFium;纯图片或
乱码页按页调用 RapidOCR。标准化结果和原始页面提取结果都按内容校验和缓存,幂等重试
不会重复解析或 OCR 同一本书。
导入文本本身不会自动变成可执行规则。只有通过 mechanic IR 和 provider 校验的部分参与结算。2014/2024 核心引擎也封装为不可变内置 core pack;campaign 和 Snapshot 锁定精确版本、checksum 与依赖,恢复时缺少任何包都会拒绝物化状态。
规则 profile/pack 写入要求最新 expected_revision 和稳定 idempotency_key。campaign_rules_explain 给出当前 branch lock、fingerprint、mechanic ids 与引用;rule receipt 保留结算时使用的不可变证据。
模组生成先形成可编辑 artifact,再经 staged inspect/import。导入生成 scene index 和保守的 location/room 证据;系统不会从散文中凭空画精确战术地图。战斗开始时才为 encounter 创建临时五尺方格 combat map,随后由 DM/Agent 在证据和裁决基础上补充位置与世界变化。地图背景不具机械意义;墙体、视线、掩体、高度、体型占位和困难地形消耗在引擎实现前继续由 DM 裁决。
sagasmith://skill/{skill_id}sagasmith://skills/overviewskill_asset_list 与 skill_asset_readdnd_dm、module_generator部分 Host 只发现静态 resources,不发现 resource templates;这时通过 asset 工具读取动态资源。
| 环境变量 | 作用 |
|---|---|
SAGASMITH_DND_MCP_HOME | 移动服务拥有的全部本地状态 |
SAGASMITH_DND_MCP_DENSE_ENABLED=1 | 启用 embedding-backed retrieval |
SAGASMITH_DATABASE_URL | 使用外部 Core 数据库 |
CHROMA_DB_URL / CHROMA_DB_PATH | 远程或自定义本地 Chroma |
SAGASMITH_DND_SKILLS_DIR | 指向 D&D Skills checkout |
SAGASMITH_MODULEGEN_SKILLS_DIR | 指向 module generator checkout |
SAGASMITH_DND_MCP_RULE_IMPORT_ROOTS | os.pathsep 分隔的规则书导入白名单 |
SAGASMITH_DND_MCP_RULE_OCR=0/1 | 是否对纯图片或乱码规则书页启用选择性 OCR;默认启用 |
SAGASMITH_DND_MCP_RULE_OCR_SCALE | OCR 页渲染倍率;默认 2.0 |
SAGASMITH_DND_MCP_MODULE_IMPORT_ROOTS | os.pathsep 分隔的模组 PDF/Markdown/text 导入白名单 |
SAGASMITH_DND_MCP_AUTO_SEED=0 | 禁用 bundled core reference 自动 seed |
SAGASMITH_DND_GATEWAY_HOST / PORT | UI adapter 监听地址,默认 127.0.0.1:8766 |
SAGASMITH_DND_GATEWAY_TOKEN | 非 loopback 访问所需 Bearer token |
SAGASMITH_DND_GATEWAY_ORIGINS | 逗号分隔的精确 CORS origin allowlist |
服务永远不会直接导入模型任意选择的路径。规则书必须位于 allowlisted root;商业内容由用户自行确保使用权。
pytest
ruff check .
# 使用全新 home 的真实 smoke 数据;不会迁移旧数据
$env:PYTHONPATH = "$PWD\src;$PWD\..\sagasmith-core\src;$PWD\..\sagasmith-dnd\src"
python scripts\smoke_seed.py --home C:\tmp\sagasmith-dnd-smoke-01
# 对白名单目录中的全部 PDF/Markdown/text 跑公开 staged facade 回归
python scripts\regression_rulebooks.py C:\path\to\DnD-Books\5e\Books `
--home C:\tmp\sagasmith-dnd-rulebook-regression `
--output C:\tmp\sagasmith-dnd-rulebook-report.json
Smoke seed 创建两个 PC、一个 NPC、相互隔离的 actor knowledge、一个见证事件、受审计的钱包变更和基线 Snapshot。
项目处于 Alpha,但这是 SagaSmithAI 当前最完整的 Agent-to-rules 参考实现。代码使用 MIT License;用户导入内容保留各自许可与来源。
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
Google's universal MCP server supporting PostgreSQL, MySQL, MongoDB, Redis, and 10+ databases
Official GitHub integration for repos, issues, PRs, and CI/CD workflows