TypeWriter MCP

TypeWriter MCP

Enables AI assistants to read and edit storylines for the Typewriter Minecraft plugin, including pages, dialogues, facts, and triggers, over websocket or offline file mode.

Category
Visit Server

README

TypeWriter MCP

MCP server for the Typewriter Minecraft plugin. It lets AI assistants in Cursor, Claude Desktop, and other MCP clients read and edit storylines: pages, dialogues, facts, triggers, and the rest of the entry graph.

You can work live against a running server over websocket, or edit page JSON files offline.

What it does

Typewriter stores story content as pages and entries. The web editor is fine for manual work, but slow when you want an agent to draft whole branches, fix dialogue, or wire up triggers across dozens of entries. This server exposes that data as MCP tools so the assistant can do the editing for you.

In socket mode it uses the same protocol as the official web editor. Changes land in staging first, show up in the panel, and can be published to production without clobbering work you have open elsewhere.

Modes

Socket (recommended for live servers)

Connect to the running plugin over websocket. Best for production and any setup where you want changes visible in the web panel before they go live.

File (offline)

Edit plugins/Typewriter/pages/*.json directly. Useful when the server is down or you want to batch-edit files and reload later. Run /typewriter reload on the server after saving.

Install

git clone https://github.com/yurchik228336/TypeWriter-MCP.git
cd TypeWriter-MCP
npm install
npm run build

Requires Node.js 18+.

Cursor / Claude Desktop config

Add this to your MCP config (for Cursor: ~/.cursor/mcp.json):

{
  "mcpServers": {
    "typewriter": {
      "command": "node",
      "args": ["C:/path/to/TypeWriter-MCP/dist/index.js"],
      "env": {
        "TYPEWRITER_MODE": "socket",
        "TYPEWRITER_URL_FILE": "C:/path/to/TypeWriter-MCP/.typewriter-session-url"
      }
    }
  }
}

With this setup the server starts in socket mode and waits for a connect URL. When you want to work live, run /typewriter connect in-game and paste the full link into chat. The agent calls connect_live and keeps the socket open for the rest of the session. You do not need to paste the link again while that connection is still alive.

If you prefer a fixed URL in config instead:

"env": {
  "TYPEWRITER_MODE": "socket",
  "TYPEWRITER_URL": "http://host:8080/#/connect?host=1.2.3.4&port=9092&token=<uuid>"
}

Note: with auth: session, that token expires when the player who generated it logs out.

File mode:

"env": {
  "TYPEWRITER_MODE": "file",
  "TYPEWRITER_PAGES_DIR": "C:/server/plugins/Typewriter/pages"
}

Typewriter plugin setup (socket)

  1. Enable websocket in plugins/Typewriter/config.yml:
enabled: true
websocket:
  port: 9092
  auth: session

Restart the server after editing the config.

  1. In-game, run /typewriter connect. You get a URL like:
http://host:8080/#/connect?host=1.2.3.4&port=9092&token=<uuid>
  1. Paste that URL to your agent or set it in TYPEWRITER_URL.

Plain websocket URLs work too: ws://host:9092?token=<uuid>

For a trusted local network you can set auth: none and skip tokens. Only do that if you know what you are exposing.

Typical agent workflow

  1. Paste the connect URL when starting a live session.
  2. list_pages / read_page to see what exists.
  3. create_page, add_entry, connect_entries to build or extend the story.
  4. validate_storyline to catch broken trigger references.
  5. publish to apply staging changes in-game (socket mode only).

If the session drops or the token expires, send a fresh connect URL.

Example prompts

Paste these into Cursor or Claude Desktop when the Typewriter MCP is connected. For live work, include your connect URL in the first message.

Connect and inspect

Here is my Typewriter connect URL: http://host:8080/#/connect?host=1.2.3.4&port=9092&token=...
Connect to the server and list all pages. Tell me what storylines already exist.
Read the page named "chapter1" and summarize every dialogue entry and how the triggers are wired.

Create a new storyline

Connect with this URL: ...
Create a static page called "village_npcs" with a simple_speaker entry for a villager named Mira.
Then create a sequence page called "village_intro" with a spoken_dialogue where Mira greets the player.
Wire the dialogue flow with connect_entries and run validate_storyline when you are done.
Publish the changes.
Add a new option_dialogue to page "chapter2" with two choices:
1) "I'll help you" -> sets a permanent_fact "agreed_to_help"
2) "Not now" -> ends the conversation
Link the options to the correct follow-up entries.

Edit existing content

Search all pages for the text "old quest name" and update every matching dialogue line to "new quest name".
Do not change entry ids or trigger links.
On page "main_quest", find the entry where the blacksmith speaks and change his line to:
"We need iron from the mines. Bring me ten ingots and I'll pay you well."

Debug and validate

Run validate_storyline across the whole project and fix any broken trigger references you can resolve without guessing missing entries.
Show me what you changed.
Search for entries that reference fact id "abc123" and list which pages use it.

File mode (offline)

Using file mode, read everything under plugins/Typewriter/pages.
Create a new sequence page "side_quest_rat" with three spoken_dialogue entries: start, middle, reward.
Save the files. I will run /typewriter reload on the server myself.

Tools

Tool Description
connection_status Current mode, connection state, saved URL
connect_live Connect using a /typewriter connect URL
list_pages List pages (id, name, type, entry count)
read_page Read a full page by name or id
create_page Create a page (sequence, static, cinematic, manifest)
rename_page Rename a page
delete_page Delete a page and all its entries
add_entry Add an entry (dialogue, speaker, fact, etc.)
update_entry Update one field by dotted path (text, speaker, criteria.0.value)
replace_entry Replace an entry, keeping the same id
delete_entry Delete an entry by id
connect_entries Append a trigger link between two entries
search_entries Full-text search across all pages
validate_storyline Find broken references in triggers / triggeredBy
publish Publish staging to production (socket mode only)

Environment variables

Variable Default Description
TYPEWRITER_MODE socket socket or file
TYPEWRITER_URL Optional fixed connect URL
TYPEWRITER_URL_FILE .typewriter-session-url in cwd Where the last connect URL is stored
TYPEWRITER_PAGES_DIR plugins/Typewriter/pages Pages directory for file mode

License

MIT. Use it however you want: personal projects, servers, forks, commercial work, no permission needed. See LICENSE.

Not affiliated

This is an unofficial community tool. Typewriter is developed by its own team; this MCP just speaks their websocket and file formats.

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured