mcp-rpg-worldstate
Gives an AI game master a persistent memory for tabletop roleplaying games by storing worlds, characters, plots, and scenes. It enables saving, searching, and loading game state (via MCP tools) so the GM doesn't have to recall plot and details only from the context window.
README
MCP RPG Worldstate
Ein lokaler, systemneutraler MCP-Server, der einer KI-Spielleitung ein dauerhaftes Gedächtnis für Rollenspielwelten gibt. Er speichert erzählerische Inhalte überwiegend als Freitext und strukturiert nur das, was für Suche und Konsistenz wichtig ist: Weltzugehörigkeit, Entitätstypen, Orte, Szenen, Teilnehmer und aktive Zustände.
Leitgedanke
Gespeichert werden dauerhafte oder erzählerisch relevante Fakten – nicht jede vorübergehende Beobachtung. Eine kaputte planetare Wettersteuerung kann wichtig sein; eine im Wind veränderte Frisur normalerweise nicht.
Der typische Abruf ist absichtlich gestuft:
list_worldszeigt vorhandene Spielstände.get_world_overviewliefert eine kompakte Save-Preview.get_current_contextlädt die unmittelbar spielbare Szene.search_entitiesholt nur bei Bedarf weitere Details.
Änderungen lassen sich mit apply_world_changes in einem einzigen atomaren Aufruf bündeln.
Neu angelegte Entitäten können sich innerhalb desselben Aufrufs über lokale Referenzen aufeinander beziehen. Ein kompaktes Ereignis- und Checkpoint-Archiv erklärt bei Bedarf, wie der aktuelle Zustand entstanden ist, ohne den autoritativen Weltzustand zu ersetzen.
Voraussetzungen und Installation
- Node.js 24 oder neuer (für das integrierte SQLite-Modul)
- npm
npm install
npm run build
npm test
Der Server verwendet standardmäßig rpg-worldstate.sqlite im Arbeitsverzeichnis. Für einen stabilen, expliziten Speicherort sollte RPG_WORLDSTATE_DB als absoluter Pfad gesetzt werden.
MCP-Konfiguration
Ein lokaler MCP-Client kann den Server über stdio starten. Das allgemeine Konfigurationsmuster lautet:
{
"mcpServers": {
"rpg-worldstate": {
"command": "node",
"args": [
"/home/eurobertics/projects/mcp_rpg_worldstate/dist/index.js"
],
"env": {
"RPG_WORLDSTATE_DB": "/home/eurobertics/projects/mcp_rpg_worldstate/rpg-worldstate.sqlite"
}
}
}
}
Die genaue Stelle für diese Konfiguration hängt vom verwendeten MCP-Client ab. Der Server schreibt Protokollmeldungen ausschließlich nach stderr, damit das MCP-Protokoll auf stdout sauber bleibt.
Claude Desktop unter Windows mit Server in WSL
Wenn Claude Desktop unter Windows läuft, der MCP-Server aber innerhalb von WSL installiert ist, kann Claude ihn über wsl.exe starten. Die Konfiguration befindet sich normalerweise unter:
%APPDATA%\Claude\claude_desktop_config.json
Beispiel:
{
"mcpServers": {
"rpg-worldstate": {
"command": "wsl.exe",
"args": [
"-d",
"Ubuntu",
"--exec",
"bash",
"-lc",
"cd /home/eurobertics/projects/mcp_rpg_worldstate && RPG_WORLDSTATE_DB=/home/eurobertics/projects/mcp_rpg_worldstate/rpg-worldstate.sqlite exec node dist/index.js"
]
}
}
}
Ubuntu muss dem exakten Namen der verwendeten WSL-Distribution entsprechen. Die installierten Distributionen zeigt PowerShell mit folgendem Befehl an:
wsl.exe --list --quiet
bash -lc lädt eine Login-Shell. Das ist insbesondere dann wichtig, wenn Node.js über einen Versionsmanager wie fnm oder nvm installiert wurde. Projekt- und Datenbankpfad sind Linux-Pfade innerhalb von WSL. Die vollständige Shell-Anweisung muss in der JSON-Konfiguration ein einzelnes Element von args bleiben.
Der Start lässt sich vor der Claude-Konfiguration direkt aus PowerShell prüfen:
wsl.exe -d Ubuntu --exec bash -lc "cd /home/eurobertics/projects/mcp_rpg_worldstate && RPG_WORLDSTATE_DB=/home/eurobertics/projects/mcp_rpg_worldstate/rpg-worldstate.sqlite exec node dist/index.js"
Bei erfolgreichem Start erscheint auf stderr beispielsweise:
mcp-rpg-worldstate is using /home/eurobertics/projects/mcp_rpg_worldstate/rpg-worldstate.sqlite
Der Prozess bleibt anschließend aktiv und wartet auf MCP-Nachrichten über stdin. Das ist das erwartete Verhalten. Nach einer Änderung der Konfigurationsdatei muss Claude Desktop vollständig beendet und neu gestartet werden.
ChatGPT-Hinweis: Diese Konfiguration verwendet den lokalen
stdio-Transport von Claude Desktop. Sie lässt sich nicht unverändert für ChatGPT Desktop übernehmen. Dafür müsste der Server zusätzlich über einen von ChatGPT unterstützten HTTP-Transport und eine erreichbare URL bereitgestellt werden.
Werkzeuge
| Tool | Zweck |
|---|---|
list_worlds |
Kompakte Liste aller Spielstände |
create_world |
Neue isolierte Welt/Kampagne erstellen |
update_world |
Dauerhafte Weltbeschreibung oder Kurzfassung ändern |
delete_world |
Welt inklusive aller abhängigen Daten rekursiv löschen |
apply_world_changes |
Entitäten gesammelt erstellen, ändern oder löschen |
search_entities |
Charaktere, Orte, Plots, Notizen und Gegenstände suchen |
set_current_scene |
Aktuelle Szene und Teilnehmer kompakt festhalten |
get_world_overview |
Token-arme Save-Preview laden |
get_current_context |
Aktuellen spielbaren Kontext laden |
create_checkpoint |
Spielersicheren Rückblick und optionale GM-Notizen speichern |
get_recent_events |
Relevante Ereignisse paginiert oder seit einem Checkpoint lesen |
list_checkpoints |
Ältere Session- und Kapitelstände paginiert laden |
random_numbers |
Neutrale Zufallszahlen für erzählerische Entscheidungen |
Entitätstypen sind character, location, plot, note und item. Ein Charakter oder Gegenstand kann über locationId einen aktuellen Ort erhalten. Orte können mit parentId verschachtelt werden. Szenenteilnahme ist davon getrennt: Ein kurzer gemeinsamer Szenenwechsel muss nicht automatisch alle dauerhaften Aufenthaltsorte verändern.
Lokale Referenzen in einem Batch
Create-Operationen können eine innerhalb des Aufrufs eindeutige ref definieren. Andere Änderungen dürfen diese mit locationRef oder parentRef verwenden, auch wenn die referenzierte Create-Operation später im Array steht:
{
"worldId": 1,
"changes": [
{
"action": "create",
"ref": "mara",
"kind": "character",
"name": "Mara",
"locationRef": "tavern"
},
{
"action": "create",
"ref": "cellar",
"kind": "location",
"name": "Weinkeller",
"parentRef": "tavern"
},
{
"action": "create",
"ref": "tavern",
"kind": "location",
"name": "Zum hinkenden Drachen"
}
],
"summary": "Mara und ihr Gasthaus wurden eingeführt."
}
Die Antwort enthält createdRefs mit den erzeugten numerischen IDs. Unbekannte, doppelte oder zirkuläre Referenzen sowie die gleichzeitige Angabe von beispielsweise locationId und locationRef brechen die gesamte Transaktion ab.
Ereignisse, Geheimnisse und Checkpoints
Eine summary in apply_world_changes erzeugt einen kompakten historischen Ereigniseintrag. Sobald der Batch eine geheime Entität betrifft, muss die Zusammenfassung mit eventSecret: true als geheim markiert oder weggelassen werden. So kann keine geheime Änderung versehentlich in der öffentlichen Ereignishistorie erscheinen.
get_recent_events liefert Ereignisse standardmäßig in der Reihenfolge id DESC, unterstützt beforeId zur rückwärtsgerichteten Pagination, Textsuche und sinceCheckpointId. Jeder Checkpoint speichert intern den damaligen Ereignisstand, sodass „Was geschah seit diesem Checkpoint?“ eindeutig beantwortet werden kann.
list_checkpoints liefert ältere Checkpoints ebenfalls neueste zuerst und paginiert über beforeId.
Spielersichere Checkpoints
Jeder neue Checkpoint trennt zwei Informationskanäle:
{
"worldId": 1,
"title": "Die Nacht im hinkenden Drachen",
"playerRecap": "Bernd fand im Keller eine königliche Münze. Mara behauptete, sie noch nie gesehen zu haben.",
"gmNotes": "Mara ist die verschwundene Königin."
}
playerRecapist verpflichtend und ausschließlich für bereits beobachtete, enthüllte oder vernünftigerweise bekannte Tatsachen bestimmt.gmNotesist optional und immer ausschließlich für den Gamemaster bestimmt.- Verborgene Identitäten, Motive, Ursachen, Pläne, Orte und zukünftige Entwicklungen gehören niemals in
playerRecap. - Im Zweifel gehört eine Information in
gmNotes, eine geheime Entität oder ein geheimes Event – nicht in den öffentlichen Rückblick.
Der Server klassifiziert, bereinigt oder formuliert Inhalte nicht automatisch um. Die aufrufende KI ist für die richtige Einordnung verantwortlich. Entitäten und Events bleiben die autoritative Quelle; Checkpoints sind kompakte narrative Save-Previews.
get_world_overview und list_checkpoints geben standardmäßig ausschließlich playerRecap zurück. gmNotes wird nur bei includeSecrets: true als separates Feld ausgegeben. Diese Option darf nur in einem berechtigten Gamemaster-Kontext verwendet werden. Beide Texte werden vom Server niemals zusammengeführt.
Die frühere Eingabe summary für create_checkpoint wird nicht mehr akzeptiert. Dadurch muss jeder neue Client ausdrücklich einen spielersicheren Rückblick erstellen.
Datenbankmigrationen
Das Schema wird über SQLite PRAGMA user_version versioniert. Beim Serverstart werden ältere Datenbanken automatisch innerhalb von Transaktionen auf den aktuellen Stand migriert. Alte Checkpoint-summary-Inhalte gelten vorsichtshalber als potenziell geheim: Sie werden nach gmNotes übernommen und öffentlich nur durch einen neutralen Hinweis ersetzt. Eine alte Zusammenfassung wird niemals automatisch als Spielerwissen veröffentlicht. Vor einem Versionswechsel empfiehlt sich trotzdem eine Sicherung der SQLite-Datei.
Optionale Codex-Skill
Unter skills/rpg-worldstate-gm liegt eine kleine begleitende Skill mit Regeln für sparsames Laden, relevante Zustandsänderungen, Geheimnisse und Checkpoints. Sie ist nicht für den MCP-Server oder andere Clients erforderlich.
Zur lokalen Installation kann der Ordner in das persönliche Codex-Skill-Verzeichnis kopiert werden:
cp -R skills/rpg-worldstate-gm ~/.codex/skills/
Löschen und Konsistenz
delete_world verlangt zur Sicherheit die exakte Bestätigung DELETE: <Weltname>. Danach entfernt SQLite über Foreign-Key-Cascades alle Charaktere, Orte, Plots, Szenen, Checkpoints und Ereignisse dieser Welt.
Verknüpfungen zwischen verschiedenen Welten werden abgelehnt. Gebündelte Änderungen laufen in einer Transaktion: Ist eine Änderung ungültig, wird keine davon gespeichert.
Entwicklung
npm run dev
npm run check
npm test
Die wichtigsten Dateien sind:
src/store.ts: SQLite-Schema, Validierung und Abfragensrc/server.ts: öffentliche MCP-Tools und Eingabeschematasrc/index.ts: lokaler stdio-Einstiegspunktsrc/*.test.ts: Datenbank- und MCP-Protokolltests
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。